![]() |
1
6
“一段时间”有多长?…我想说,尝试并行比较尽可能多的值会有帮助,也许使用一些SIMD指令一次比较超过4个字节? 但是请记住,无论您进行比较的速度有多快,最终还是需要从文件中读取数据。如果文件不在内存中的某个缓存中,那么在磁盘带宽达到饱和之前,您可能会被限制为以100-150 MB/s的最大速率。如果您已经达到了这一点,那么您可能首先需要考虑一种避免加载文件的方法,或者只接受这样一个事实:它不会比这更快。 |
![]() |
2
2
文件/块块中是否存在更可能具有非零值的位置?你只要找到 一 非零值(您的中断条件),所以请先查找最有可能找到它们的地方——不必是文件/块的开头。根据实际应用情况,从末尾开始或检查中间的1/3可能是有意义的。 但是,我不建议随机跳转到不同的位置;从磁盘读取可能会变得难以置信;)… |
![]() |
3
0
我想看看这个函数的汇编输出。 你可以做的一些事情,将大大加快它是使用SSE指令。使用这些指令,您可以一次加载8个字节,检查所有字节是否为零,然后继续。 你也可以把它展开几次。 |
![]() |
4
0
你的算法看起来不错,但你可以启发式地优化开始的地方,如果你事先知道你将得到什么类型的文件…但再次,如果它是一个特定的文件,最有可能的信息将在头(前几个字节)。 另外,请确保块的大小不是来自调用该方法的人的1:。 还可以查看Boost的内存映射文件功能…这可能会有所帮助,具体取决于如何计算最佳块大小-> |
![]() |
5
0
我有一个“开箱即用”的答案给你,但我不确定在你的情况下实施是多么可行。 如果你不控制倾倒过程:因为这是一个大的回收(倾倒?)在例外情况下生成的文件,为什么不在转储后立即扫描低优先级的文件(0字节),然后以某种方式标记该文件以便以后更快地识别?(或者您可以压缩它,稍后解析/扫描zip文件) 或者,如果您控制了转储过程:(一个缓慢的过程,您无论如何都要做)为什么不在转储文件的末尾(或者返回并在其开头写入)指出转储文件是由0填充的还是有一些有效的数据(因为您编写了它,并且您知道其中包含什么)?这样,您就不必为I/O开销支付两次。 这里的目标是通过将过程延迟到更久的时间,使读取速度更快,因为当转储发生时,不太可能有操作员等待它加载。 |
![]() |
6
0
首先,不要每次都分配一个新的缓冲区。分配一个(每个线程)并重用它。使用一个很好的大块,并进行多次读取/检查。
当然,对于其中的任何一个,您都希望获得一些度量标准,并了解实际有什么帮助。 |
![]() |
7
0
我会告诉你一个肮脏,不便携和困难的方式,但比可以更有效…如果您处理的是稀疏的文件,那么您真的很无聊,并且想要处理您正在使用的文件系统的内部,您可以尝试添加一个新的函数,该函数将返回一个位图,指示哪些块被映射,哪些块没有映射(那些没有映射的块被归零,其余的块仍然需要手动检查)。 是的,我知道这很疯狂,没有人愿意做这种事。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |