Skip to content

Commit a7c5388

Browse files
committed
Cache the committer datetime to improve performance
This can drop from 26s to 3s!!!!
1 parent 9a5773c commit a7c5388

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

qgitc/common.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- coding: utf-8 -*-
22

33
import cProfile
4+
from datetime import datetime
45
import pstats
56
import io
67
import os
@@ -29,6 +30,7 @@ def __init__(self):
2930
self.authorDate = ""
3031
self.committer = ""
3132
self.committerDate = ""
33+
self.committerDateTime: datetime = None
3234
self.parents: List[str] = []
3335
self.children: List[str] = None
3436
self.repoDir: str = None

qgitc/logsfetcher.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ def parse(self, data: bytes):
4141
if not commit.sha1:
4242
continue
4343
commit.repoDir = self.repoDir
44+
if self.repoDir:
45+
commit.committerDateTime = datetime.strptime(
46+
commit.committerDate, "%Y-%m-%d %H:%M:%S %z")
4447
commits.append(commit)
4548

4649
self.logsAvailable.emit(commits)
@@ -86,19 +89,15 @@ def hasSinceArg(args: List[str]):
8689
return False
8790

8891

89-
def makeDateTime(dateStr: str):
90-
return datetime.strptime(dateStr, "%Y-%m-%d %H:%M:%S %z")
91-
92-
9392
# the builtin bisect key required python >= 3.10
9493
def insort_logs(a: List[Commit], x: Commit):
9594
lo = 0
9695
hi = len(a)
9796

98-
xDate = makeDateTime(x.committerDate)
97+
xDate = x.committerDateTime
9998
while lo < hi:
10099
mid = (lo + hi) // 2
101-
t = makeDateTime(a[mid].committerDate)
100+
t = a[mid].committerDateTime
102101
if xDate < t:
103102
lo = mid + 1
104103
else:
@@ -170,10 +169,10 @@ def run(self):
170169
# no need to merge for the first repo (all the logs from same repo)
171170
if not firstRepo and self.mergeLog(mergedLogs, log):
172171
continue
173-
logDate = makeDateTime(log.committerDate)
174-
if len(mergedLogs) == 0 or logDate < makeDateTime(mergedLogs[-1].committerDate):
172+
logDate = log.committerDateTime
173+
if len(mergedLogs) == 0 or logDate < mergedLogs[-1].committerDateTime:
175174
mergedLogs.append(log)
176-
elif logDate > makeDateTime(mergedLogs[0].committerDate):
175+
elif logDate > mergedLogs[0].committerDateTime:
177176
mergedLogs.insert(0, log)
178177
else:
179178
insort_logs(mergedLogs, log)
@@ -190,8 +189,8 @@ def mergeLog(self, mergedLogs: List[Commit], target: Commit):
190189
if self.isInterruptionRequested():
191190
return True
192191

193-
targetDate = makeDateTime(target.committerDate)
194-
logDate = makeDateTime(log.committerDate)
192+
targetDate = target.committerDateTime
193+
logDate = log.committerDateTime
195194
# since mergedLogs is sorted by committerDate, we can break here
196195
if targetDate.year > logDate.year or targetDate.month > logDate.month or targetDate.day > logDate.day:
197196
return False

0 commit comments

Comments
 (0)