Bug 1923 – GC optimization for contiguous pointers to the same page

Status
RESOLVED
Resolution
FIXED
Severity
enhancement
Priority
P3
Component
phobos
Product
D
Version
D1 (retired)
Platform
All
OS
All
Creation time
2008-03-14T03:10:00Z
Last change time
2014-02-24T16:00:26Z
Keywords
patch
Assigned to
bugzilla
Creator
dlang-bugzilla

Attachments

IDFilenameSummaryContent-TypeSize
239contiguous-pointers.patchProposed patchtext/plain1137

Comments

Comment #0 by dlang-bugzilla — 2008-03-14T03:10:58Z
Probably the best practical example for this situation is splitting a large text file by whitespace: import std.file, std.string, std.gc; import std.stdio: putr = writefln; alias char[] string; static import std.c.time; double clock() { auto t = std.c.time.clock(); return t/cast(double)std.c.time.CLOCKS_PER_SEC; } void main() { //disable; auto t0 = clock(); auto txt = cast(string)read("text.txt"); // 6.3 MB of text auto t1 = clock(); auto words = txt.split(); auto t2 = clock(); putr("loading time: ", t1 - t0); // 0.08 s putr("splitting time: ", t2 - t1); // 3.69 s with GC, 0.66 s without // Total running time with GC = 10.85 s } Example is from this NG post by bearophile: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=67673 The attached patch increases the performance of this particular case tenfold by my tests. It should have no significant overhead on other situations. There's a bit more info in my reply to the abovementioned NG post.
Comment #1 by dlang-bugzilla — 2008-03-14T03:11:49Z
Created attachment 239 Proposed patch Tested myself on a >10000 line application, didn't notice any ill side-effects.
Comment #2 by leandro.lucarella — 2009-03-28T15:17:48Z
Is there any reason why this patch is no applied?
Comment #3 by dhasenan — 2009-03-28T15:50:42Z
For reference, this patch has been applied to Tango and has not caused any known issues.
Comment #4 by bugzilla — 2009-03-29T01:54:58Z
Comment #5 by bugzilla — 2009-03-29T02:05:23Z
This patch is already in D2, I'll add it to D1.
Comment #6 by leandro.lucarella — 2009-03-29T10:15:56Z
But for some reason D2 (druntime) timings are still huge. Here is a test, dmd es 1.041 with the patch attached here, dmd2 is 2.026. $ cat split.d // Written by bearophile <[email protected]> // Fount at http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=67673 // Sightly modified by Leandro Lucarella <[email protected]> // (removed timings) import std.file, std.string; import std.stdio: writefln; static import std.c.time; void main() { auto txt = cast(string) read("split.txt"); auto words = txt.split(); } $ dmd -release -O -inline -ofsplit1 split.d $ dmd2 -release -O -inline -ofsplit2 split.d $ ls -lh split.txt -rw-r--r-- 1 luca luca 15M mar 28 17:01 split.txt $ time ./split1 real 0m0.751s user 0m0.443s sys 0m0.128s $ time ./split2 real 0m25.293s user 0m20.517s sys 0m0.233s (timings for D1 without the patch are about the same as D2)
Comment #7 by bugzilla — 2009-04-01T13:51:11Z
Fixed DMD 1.042