c++ - 在 C++ 中优化 IO

标签 c++ optimization io buffer valgrind

我在优化 C++ 程序以获得尽可能快的运行时时遇到问题。

代码的要求是输出 2 个长整数之差的绝对值,通过文件馈送到程序中。即:

./myprogram < unkownfilenamefullofdata

文件名未知,每行有 2 个数字,以空格分隔。测试数据量未知。我创建了 2 个测试数据文件。其中一种情况属于极端情况,长度为 5 次。至于另一个,我使用 Java 程序生成 2,000,000 个随机数,并将其输出到 timedrun 文件 - 相当于 18.MB 的测试。

大文件运行时间为 3.4 秒。我需要将其分解为 1.1 秒。

这是我的代码:

int main() {
long int a, b;
while (scanf("%li %li",&a,&b)>-1){
  if(b>=a)
    printf("%li/n",(b-a));
  else
    printf("%li/n",(a-b));
  } //endwhile
return 0;
}//end main

我在我的程序上运行了 Valgrind,它表明读写部分存在很多阻碍。如果我知道我只会收到一个数字,我将如何将打印/扫描重写为最原始的 C++ 形式?有没有一种方法可以将数字扫描为二进制数,并通过逻辑运算操作数据来计算差异?我还被告知要考虑编写一个缓冲区,但在搜索了大约 6 个小时的网络并尝试编写代码后,我没有成功。

任何帮助将不胜感激。

最佳答案

您需要做的是将整个字符串加载到内存中,然后从那里提取数字,而不是重复进行 I/O 调用。然而,您可能会发现,从硬盘驱动器加载 18MB 需要花费大量时间。

关于c++ - 在 C++ 中优化 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9241332/

相关文章:

c++ - 删除函数签名类型的成员性? (lambda 的运算符())

c++ - 分段后如何创建掩码来选择分段类?

javascript - 使用 jQuery .one 的逻辑

c++ - NVI 和去虚拟化

c++ - 如何读写一系列项目,其中前置项目可能指的是后置项目?

c++ - 自制软件 + opencv + libpng 出错

c++ - 用C++实现AVL add?

c++ - 查找1's greater than 0'的子串总数,需要优化

flutter - File.writeAsBytes 的 'flush' 参数在 Dart.io 中有什么作用?

windows - perl中的无缓冲IO