From b30e9bd1cb3347a5db4b53729e491f4adcbb12ba Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Thu, 22 Apr 2021 04:22:37 +0000 Subject: [PATCH] add some profiling on acount/transaction list storage --- .../async/RetrieveTransactionsTask.java | 18 ++++++ .../net/ktnx/mobileledger/utils/Profiler.java | 58 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 app/src/main/java/net/ktnx/mobileledger/utils/Profiler.java diff --git a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java index 7b1b4504..b004ec9a 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java @@ -50,6 +50,7 @@ import net.ktnx.mobileledger.model.LedgerTransactionAccount; import net.ktnx.mobileledger.ui.MainModel; import net.ktnx.mobileledger.utils.Logger; import net.ktnx.mobileledger.utils.NetworkUtil; +import net.ktnx.mobileledger.utils.Profiler; import java.io.BufferedReader; import java.io.IOException; @@ -86,6 +87,7 @@ public class RetrieveTransactionsTask extends private static final Pattern reEnd = Pattern.compile("\\bid=\"addmodal\""); private static final Pattern reDecimalPoint = Pattern.compile("\\.\\d\\d?$"); private static final Pattern reDecimalComma = Pattern.compile(",\\d\\d?$"); + private static final String TAG = "RTT"; // %3A is '=' private final Pattern reAccountName = Pattern.compile("/register\\?q=inacct%3A([a-zA-Z0-9%]+)\""); @@ -624,6 +626,7 @@ public class RetrieveTransactionsTask extends AccountValueDAO valDao = DB.get() .getAccountValueDAO(); + Logger.debug(TAG, "Preparing account list"); final List list = new ArrayList<>(); for (LedgerAccount acc : accounts) { final AccountWithAmounts a = acc.toDBOWithAmounts(); @@ -637,24 +640,39 @@ public class RetrieveTransactionsTask extends list.add(a); } + Logger.debug(TAG, "Account list prepared. Storing"); accDao.storeAccountsSync(list, profile.getId()); + Logger.debug(TAG, "Account list stored"); + Profiler tranProfiler = new Profiler("transactions"); + Profiler tranAccProfiler = new Profiler("transaction accounts"); + + Logger.debug(TAG, "Storing transactions"); long trGen = trDao.getGenerationSync(profile.getId()); for (LedgerTransaction tr : transactions) { TransactionWithAccounts tran = tr.toDBO(); tran.transaction.setGeneration(trGen); tran.transaction.setProfileId(profile.getId()); + tranProfiler.opStart(); tran.transaction.setId(trDao.insertSync(tran.transaction)); + tranProfiler.opEnd(); for (TransactionAccount trAcc : tran.accounts) { trAcc.setGeneration(trGen); trAcc.setTransactionId(tran.transaction.getId()); + tranAccProfiler.opStart(); trAcc.setId(trAccDao.insertSync(trAcc)); + tranAccProfiler.opEnd(); } } + tranProfiler.dumpStats(); + tranAccProfiler.dumpStats(); + + Logger.debug(TAG, "Transactions stored. Purging old"); trDao.purgeOldTransactionsSync(profile.getId(), trGen); + Logger.debug(TAG, "Old transactions purged"); DB.get() .getOptionDAO() diff --git a/app/src/main/java/net/ktnx/mobileledger/utils/Profiler.java b/app/src/main/java/net/ktnx/mobileledger/utils/Profiler.java new file mode 100644 index 00000000..15450909 --- /dev/null +++ b/app/src/main/java/net/ktnx/mobileledger/utils/Profiler.java @@ -0,0 +1,58 @@ +/* + * Copyright © 2021 Damyan Ivanov. + * This file is part of MoLe. + * MoLe is free software: you can distribute it and/or modify it + * under the term of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your opinion), any later version. + * + * MoLe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License terms for details. + * + * You should have received a copy of the GNU General Public License + * along with MoLe. If not, see . + */ + +package net.ktnx.mobileledger.utils; + +import net.ktnx.mobileledger.BuildConfig; + +import java.util.Locale; + +public class Profiler { + private final String name; + private long opStart = 0; + private long opCount = 0; + private long opMills = 0; + public Profiler(String name) { + this.name = name; + } + public void opStart() { + if (!BuildConfig.DEBUG) + return; + + if (opStart != 0) + throw new IllegalStateException("opStart() already called with no opEnd()"); + this.opStart = System.currentTimeMillis(); + opCount++; + } + public void opEnd() { + if (!BuildConfig.DEBUG) + return; + + if (opStart == 0) + throw new IllegalStateException("opStart() not called"); + opMills += System.currentTimeMillis() - opStart; + opStart = 0; + } + public void dumpStats() { + if (!BuildConfig.DEBUG) + return; + + Logger.debug("profiler", String.format(Locale.ROOT, + "Operation '%s' executed %d times for %d ms. Average time %4.2fms", name, opCount, + opMills, 1.0 * opMills / opCount)); + } +} -- 2.39.2