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 #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)