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.
Created attachment 239 [details] Proposed patch Tested myself on a >10000 line application, didn't notice any ill side-effects.
Is there any reason why this patch is no applied?
For reference, this patch has been applied to Tango and has not caused any known issues.
Complete discussion: http://www.digitalmars.com/d/archives/digitalmars/D/Slow_GC_67673.html
This patch is already in D2, I'll add it to D1.
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 <bearophileHUGS@lycos.com> // Fount at http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=67673 // Sightly modified by Leandro Lucarella <llucax@gmail.com> // (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)
Fixed DMD 1.042
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル