Skip to content

Commit

Permalink
Only do an update every 100 commits when drawing the graph.
Browse files Browse the repository at this point in the history
On a large repository with > 60,000 commits, each call to the Tk
update primitive (which gives Tk a chance to respond to events and
redraw the screen) was taking up to 0.2 seconds.  Because the logic
was to call update after drawing a commit if 0.1 seconds had passed
since the last update call, we were calling it for every commit,
which was slowing us down enormously.  Now we also require that we
have drawn 100 commits since the last update (as well as it being
at least 0.1 seconds since the last update).  Drawing 100 commits
takes around 0.1 - 0.2 seconds (even in this large repo) on my G5.
  • Loading branch information
Paul Mackerras committed Aug 10, 2005
1 parent b1ba39e commit 466e4fd
Showing 1 changed file with 21 additions and 10 deletions.
31 changes: 21 additions & 10 deletions gitk
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ proc gitdir {} {

proc getcommits {rargs} {
global commits commfd phase canv mainfont env
global startmsecs nextupdate
global startmsecs nextupdate ncmupdate
global ctext maincursor textcursor leftover

# check that we can find a .git directory somewhere...
Expand All @@ -31,6 +31,7 @@ proc getcommits {rargs} {
set phase getcommits
set startmsecs [clock clicks -milliseconds]
set nextupdate [expr $startmsecs + 100]
set ncmupdate 0
if [catch {
set parse_args [concat --default HEAD $rargs]
set parsed_args [split [eval exec git-rev-parse $parse_args] "\n"]
Expand All @@ -49,7 +50,7 @@ proc getcommits {rargs} {
}
set leftover {}
fconfigure $commfd -blocking 0 -translation lf
fileevent $commfd readable "getcommitlines $commfd"
fileevent $commfd readable [list getcommitlines $commfd]
$canv delete all
$canv create text 3 3 -anchor nw -text "Reading commits..." \
-font $mainfont -tags textitems
Expand All @@ -61,6 +62,7 @@ proc getcommitlines {commfd} {
global commits parents cdate children nchildren
global commitlisted phase commitinfo nextupdate
global stopped redisplaying leftover
global numcommits ncmupdate

set stuff [read $commfd]
if {$stuff == {}} {
Expand Down Expand Up @@ -108,8 +110,10 @@ to allow selection of commits to be displayed.)}
set commitlisted($id) 1
parsecommit $id $cmit 1
drawcommit $id
if {[clock clicks -milliseconds] >= $nextupdate} {
if {[clock clicks -milliseconds] >= $nextupdate
&& $numcommits >= $ncmupdate + 100} {
doupdate
set ncmupdate $numcommits
}
while {$redisplaying} {
set redisplaying 0
Expand All @@ -119,8 +123,10 @@ to allow selection of commits to be displayed.)}
foreach id $commits {
drawcommit $id
if {$stopped} break
if {[clock clicks -milliseconds] >= $nextupdate} {
if {[clock clicks -milliseconds] >= $nextupdate
&& $numcommits >= $ncmupdate + 100} {
doupdate
set ncmupdate $numcommits
}
}
}
Expand All @@ -134,7 +140,7 @@ proc doupdate {} {
incr nextupdate 100
fileevent $commfd readable {}
update
fileevent $commfd readable "getcommitlines $commfd"
fileevent $commfd readable [list getcommitlines $commfd]
}

proc readcommit {id} {
Expand Down Expand Up @@ -1090,7 +1096,7 @@ proc decidenext {{noread 0}} {

proc drawcommit {id} {
global phase todo nchildren datemode nextupdate
global startcommits
global startcommits numcommits ncmupdate

if {$phase != "incrdraw"} {
set phase incrdraw
Expand Down Expand Up @@ -1119,8 +1125,10 @@ proc drawcommit {id} {
if {![info exists commitlisted($id)]} {
break
}
if {[clock clicks -milliseconds] >= $nextupdate} {
if {[clock clicks -milliseconds] >= $nextupdate
&& $numcommits >= $ncmupdate} {
doupdate
set ncmupdate $numcommits
if {$stopped} break
}
}
Expand Down Expand Up @@ -1158,11 +1166,12 @@ proc settextcursor {c} {
}

proc drawgraph {} {
global nextupdate startmsecs startcommits todo
global nextupdate startmsecs startcommits todo ncmupdate

if {$startcommits == {}} return
set startmsecs [clock clicks -milliseconds]
set nextupdate [expr $startmsecs + 100]
set ncmupdate 0
initgraph
set todo [lindex $startcommits 0]
drawrest 0 1
Expand All @@ -1171,7 +1180,7 @@ proc drawgraph {} {
proc drawrest {level startix} {
global phase stopped redisplaying selectedline
global datemode currentparents todo
global numcommits
global numcommits ncmupdate
global nextupdate startmsecs startcommits idline

if {$level >= 0} {
Expand Down Expand Up @@ -1200,9 +1209,11 @@ proc drawrest {level startix} {
if {$level < 0} break
drawslants $level
}
if {[clock clicks -milliseconds] >= $nextupdate} {
if {[clock clicks -milliseconds] >= $nextupdate
&& $numcommits >= $ncmupdate + 100} {
update
incr nextupdate 100
set ncmupdate $numcommits
}
}
}
Expand Down

0 comments on commit 466e4fd

Please sign in to comment.