Text editing [Was: Re: #line decoder]
bearophile
bearophileHUGS at lycos.com
Sat Sep 27 05:00:02 PDT 2008
Sergey Gromov, there's a bug in your code, you don't perform the dup, so the contents of all the string slices are lost. This is a bug-prone feature of the current D, I have done several times similar bugs in the past.
The timings:
Updated timings:
Timings, data2.txt, warm timings, best of 3:
loader1: 23.05 s
loader2: 3.00 s
loader3: 44.79 s
loader4: 39.28 s
loader5: 21.31 s
loader6: 7.20 s
loader7: 7.51 s
loader8: 8.45 s
loader9: 5.46 s
loader10: 3.73 s
loader10b: 3.88 s
loader11: 82.54 s
loader12: 38.87 s
loader13: 28.28 s
loader14: 15.37 s
loader13: 6.74 s (no GC)
loader14: 6.94 s (no GC)
Your code I have used:
// loader13
import std.stream: BufferedFile;
import std.string: split;
//import std.gc: enable, disable;
class Rope(T) {
private {
T[][] chunks;
T[] current;
size_t pool;
}
this() {
current = new T[16];
pool = 0;
}
typeof(this) opCatAssign(T el) {
if (pool >= current.length) {
chunks ~= current;
current = new T[current.length * 2];
pool = 0;
}
current[pool++] = el;
return this;
}
T[] get() {
T[] result;
foreach (c; chunks)
result ~= c;
return result ~ current[0 .. pool];
}
}
void main() {
//disable();
auto fin = new BufferedFile("data2.txt");
alias Rope!(string) SRope;
SRope[] result;
foreach (el; split(cast(string) fin.readLine())) {
result ~= new SRope;
result[$-1] ~= el;
}
foreach (char[] line; fin)
foreach (id, el; split(cast(string) line))
result[id] ~= el.dup;
auto month = result[0].get();
auto day = result[1].get();
auto num = result[2].get();
//enable();
}
// loader14
import std.stream: BufferedFile;
import std.string: split;
//import std.gc: enable, disable;
class Array(T) {
private {
T[] data;
size_t pos;
}
this() {
data = new T[16];
}
typeof(this) opCatAssign(T el) {
if (pos == data.length)
data.length = data.length * 2;
data[pos++] = el;
return this;
}
T[] get() {
return data[0 .. pos];
}
}
void main() {
//disable();
auto fin = new BufferedFile("data2.txt");
alias Array!(string) SArray;
SArray[] result;
foreach (el; split(cast(string) fin.readLine())) {
result ~= new SArray;
result[$-1] ~= el;
}
foreach (char[] line; fin)
foreach (id, el; line.split())
result[id] ~= el.dup;
auto month = result[0].get();
auto day = result[1].get();
auto num = result[2].get();
//enable();
}
Bye,
bearophile
More information about the Digitalmars-d-announce
mailing list