<p>EDIT和TL;DR:这个问题已经在<a href="https://github.com/D-Programming-Language/phobos/pull/3089" rel="nofollow">https://github.com/D-Programming-Language/phobos/pull/3089</a>中解决了。改进的<code>File.byLine</code>性能将从d2.068开始提供。在</p>
<p>我在一个575247行的文本文件中尝试了你的代码。Python基线大约需要0.125秒。下面是我的代码库,每个方法的注释中都嵌入了计时。解释如下。在</p>
<pre><code>import std.algorithm, std.file, std.stdio, std.string;
int main(string[] args)
{
if (args.length < 2) {
return 1;
}
size_t linect = 0;
// 0.62 s
foreach (line; File(args[1]).byLine())
linect += 1;
// 0.2 s
//linect = args[1].readText.count!(c => c == '\n');
// 0.095 s
//linect = args[1].readText.representation.count!(c => c == '\n');
// 0.11 s
//linect = File(args[1]).byChunk(4096).joiner.count!(c => c == '\n');
writeln("There are: ", linect, " lines.");
return 0;
}
</code></pre>
<p>我为每个变体使用<code>dmd -O -release -inline</code>。在</p>
<p>第一个版本(最慢)一次读取一行。我们可以而且应该改进byLine的性能;目前,由于将byLine与其他C stdio操作混合使用等原因,它受到了阻碍,这可能是过于保守了。如果我们去掉这些,我们可以很容易地进行预取等</p>
<p>第二个版本一下子读取文件,然后使用一个标准算法计算带有谓词的行数。在</p>
<p>第三个版本承认这样一个事实,即不需要考虑UTF的任何细微之处;计算字节也是很好的,因此它将字符串转换为字节表示(不需要任何代价),然后对字节进行计数。在</p>
<p>最后一个版本(我最喜欢的)一次从文件中读取4KB的数据,并使用<code>joiner</code>缓慢地将它们展平。然后再次计算字节数。在</p>