读取目标数组中带有"gaps"的文件
Reading file with "gaps" in destination array
我正试图找到一种方法,将文件读取到具有"间隙"的数组中:
因此,读取的数据在字节阵列buffer
中的位置buffer[0], buffer[2], .., buffer[2*i]
处,没有任何显著的速度损失。
更具体地说,我想按整数(即b[0], b[4], ..., b[i * 4]
)来阅读它。
这在任何方面都可能吗(C#,C++),或者我应该寻找另一种方法吗?
更多背景:
我正在尝试加快哈希算法(按块对文件进行哈希处理,插入块哈希,对其进行哈希处理并获取生成的哈希)
这个想法是"并行"执行SSE3和4个块,这就是为什么我需要这样的数据,这样我就可以很容易地将数据加载到寄存器中。
我用C++编写的(pinvoable)lib给出了不错的结果(即速度是原来的4倍),但重新排序数据会消耗速度。
目前我正在按块读取文件,然后重新排序int(C#):
unsafe {
uint* b = (uint*)buffer.ToPointer() + chunkIndex;
fixed(byte* blockPtr = chunk) {
uint* blockIntPtr = (uint*)blockPtr;
for(int i = 0; i < 9500 * 1024 / 4; i += 4) {
*(b + 00) = blockIntPtr[i + 0];
*(b + 04) = blockIntPtr[i + 1];
*(b + 08) = blockIntPtr[i + 2];
*(b + 12) = blockIntPtr[i + 3];
b += 16;
}
}
}
chunk
是一个字节数组,chunkIndex
是一个int,作为方法参数传递buffer
是由我的C++代码分配的uint32_t*
指针。
问题是它花费的时间太长了。调用上述代码4次大约需要90ms,而哈希需要3ms
这种巨大的差异让我觉得有点奇怪,但它产生了正确的散列。
在c++中,我会做一些类似的事情:
uint* b = (uint*)buffer;
for(int i = 0; i < 9500 * 1024; i ++) {
//read 4 ints
*(b+i+0) = blockIntPtr[i + 0];
*(b+i+1) = blockIntPtr[i + 1];
*(b+i+2) = blockIntPtr[i + 2];
*(b+i+3) = blockIntPtr[i + 3];
//skip next 12 ints
b += 16;
}
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- 读取目标数组中带有"gaps"的文件