我想盡可能快地將單個字節從文件讀取到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可能非常糟糕,而且速度很慢,那麼請嘗試改變它? –