我想尽可能快地将单个字节从文件读取到D2应用程序中。应用程序需要每个字节的字节,因此读取较大的数据块不是读取器接口的选项。在D2中读取字节的最快方法
为此我在C++,Java,D2中创建了一些简单的实现:https://github.com/gizmomogwai/performance。
正如你所看到的,我尝试了简单的读取,应用程序代码和内存映射文件中的缓冲区。 对于我的用例,内存映射解决方案效果最好,但奇怪的是D2比java慢。我希望D2能够在C++和Java之间着陆(C++代码使用-O3 -g编译,D2代码使用-O -release编译)。
所以请告诉我在这里做错了什么,以及如何加快D2的实施。
为了让您的用例这里的想法是一个C++实现:
class StdioFileReader {
private:
FILE* fFile;
static const size_t BUFFER_SIZE = 1024;
unsigned char fBuffer[BUFFER_SIZE];
unsigned char* fBufferPtr;
unsigned char* fBufferEnd;
public:
StdioFileReader(std::string s) : fFile(fopen(s.c_str(), "rb")), fBufferPtr(fBuffer), fBufferEnd(fBuffer) {
assert(fFile);
}
~StdioFileReader() {
fclose(fFile);
}
int read() {
bool finished = fBufferPtr == fBufferEnd;
if (finished) {
finished = fillBuffer();
if (finished) {
return -1;
}
}
return *fBufferPtr++;
}
private:
bool fillBuffer() {
size_t l = fread(fBuffer, 1, BUFFER_SIZE, fFile);
fBufferPtr = fBuffer;
fBufferEnd = fBufferPtr+l;
return l == 0;
}
};
size_t readBytes() {
size_t res = 0;
for (int i=0; i<10; i++) {
StdioFileReader r("/tmp/shop_with_ids.pb");
int read = r.read();
while (read != -1) {
++res;
read = r.read();
}
}
return res;
}
这一点比起在d“相同”的解决方案更快:
struct FileReader {
private FILE* fFile;
private static const BUFFER_SIZE = 8192;
private ubyte fBuffer[BUFFER_SIZE];
private ubyte* fBufferPtr;
private ubyte* fBufferEnd;
public this(string fn) {
fFile = std.c.stdio.fopen("/tmp/shop_with_ids.pb", "rb");
fBufferPtr = fBuffer.ptr;
fBufferEnd = fBuffer.ptr;
}
public int read(ubyte* targetBuffer) {
auto finished = fBufferPtr == fBufferEnd;
if (finished) {
finished = fillBuffer();
if (finished) {
return 0;
}
}
*targetBuffer = *fBufferPtr++;
return 1;
}
private bool fillBuffer() {
fBufferPtr = fBuffer.ptr;
auto l = std.c.stdio.fread(fBufferPtr, 1, BUFFER_SIZE, fFile);
fBufferEnd = fBufferPtr + l;
return l == 0;
}
}
size_t readBytes() {
size_t count = 0;
for (int i=0; i<10; i++) {
auto reader = FileReader("/tmp/shop_with_ids.pb");
ubyte buffer[1];
ubyte* p = buffer.ptr;
auto c = reader.read(p);
while (1 == c) {
++count;
c = reader.read(p);
}
}
return count;
}
我在D和Java(数学密集计算)中做了一些其他非相关编码,结果发现Java在我的测试中速度稍快。我猜你不应该指望java现在的速度要慢很多,JIT编译器非常擅长优化。 –
是啊......你是对的......我不希望java比cpp慢(它仍然在我的演示示例中使用默认的jit),但我的观点是d更慢。我希望d与cpp保持一致。 – Gizmomogwai
是的,当我在几个月前将Java算法转换为D时,我也这么做了。我认为他们在代码优化方面有一些怪癖。或者GC可能非常糟糕,而且速度很慢,那么请尝试改变它? –