On 3/19/2015 9:59 AM, "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?=
<[email protected]>" wrote:
On Thursday, 19 March 2015 at 00:42:51 UTC, weaselcat wrote:
On Wednesday, 18 March 2015 at 12:59:17 UTC, bearophile wrote:
High level constructs in D are often slower than low-level code, so in some
cases you don't want to use them.
I actually found that LDC does an _amazing_ job of optimizing high level
constructs and converting "low level" code to higher level functional code
resulted in minor speedups in a lot of cases.
(Other performance benefits include the algorithm primitives being extensively
optimized in phobos.)
If the code/compiler generates suboptimal code in the first place then
improvements can be somewhat random. But if you write code with good cache
locality, filling the pipeline properly then there is no alternative to going
low level.
Btw, take a look at this:
http://stackoverflow.com/questions/28922323/improving-line-wise-i-o-operations-in-d
That's really bad marketing...
Sigh. The Python version:
-----------
import sys
if __name__ == "__main__":
if (len(sys.argv) < 2):
sys.exit()
infile = open(sys.argv[1])
linect = 0
for line in infile:
linect += 1
print "There are %d lines" % linect
----------
does not allocate memory. The splitLines() version:
----------
import std.stdio;
import std.string;
import std.file;
int main(string[] args)
{
if (args.length < 2) {
return 1;
}
auto c = cast(string) read(args[1]);
auto l = splitLines(c);
writeln("There are ", l.length, " lines.");
return 0;
}
---------
allocates memory for all the lines and an array of them. No wonder it's slow!
The allocations are slow, and filling them all when they are cold-cached -
AWFUL! (It also uselessly and maddeningly auto-decodes, a misfeature of Phobos
if there ever was one.)
http://dlang.org/phobos/std_string.html#.splitLines