假设我正在逐行读取一个文件(包含8亿行),然后处理数据(非常轻的处理,基本上格式化字符串),然后将处理过的行写入另一个文件。
如果我想为从文件中读取的每100万行打印一个语句,一个基本的方法是添加一个if语句来检查迭代变量,并且对于每百万个== 0,我打印语句。
现在,这个代码检查每次迭代是否索引已达到下一个百万,这是每次迭代的额外处理吗?
有没有其他有效的方法来做到这一点,只有当迭代索引变量达到百万的倍数时,才会发送一些信号并打印语句?
答案 0 :(得分:3)
现在,这段代码会在每次迭代中检查索引是否已达到下一个百万次,并且这是每次迭代中的额外处理吗?
正确
有没有其他有效的方法来做到这一点,只有当迭代索引变量达到百万的倍数时,才会发送一些信号并打印语句?
没有 1 。
但不要担心这是“效率低下”。测试成本很可能<2>或更多个数量级小于读取和处理数据的成本。
1 - 在反射时,在某些情况下,递减专用计数器可能更有效,并测试它是否为零。此外,如果计数器溢出,'%'方法将无法正常工作。
一般建议。除非你有证据表明你有瓶颈,否则不要花时间“优化”这个级别的事情。您需要使用真实的数据来分析您的应用程序,以便您可以决定是否值得优化应用程序的这一方面。
答案 1 :(得分:3)
在我的机器上,以下需要1.4秒:
for (int i = 0; i < 800000000; ++i) {
if (i % 1000000 == 0) {
System.out.print('.');
}
}
这表明你会没事的。但是,如果有疑问,请参阅。
答案 2 :(得分:1)
如果您想要线性解决方案,那么 Stephen C 所说的最佳方式是不可能的,
但是当我们谈论Parallelism时,有一个最佳解决方案,
如果您的迭代过程状态可以被另一个正在另一个处理器上工作的线程访问,那么它可以告诉您在给定时间点的状态,而不会中断您的迭代过程,
它也是最优因为打印状态会使您的迭代过程花费Θ(0),因为它是由外部线程通过并行处理流程\处理器
希望这有帮助
答案 3 :(得分:0)
您有800M行文本数据,需要处理然后复制到单个TextFile
我同意斯蒂芬 - 不要优化,除非有瓶颈的证据
希望这会有所帮助!!