gpt4 book ai didi

c++ - 在 D2 中读取字节的最快方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:52 25 4
gpt4 key购买 nike

我想尽快从文件中读取单个字节到 D2 应用程序中。应用程序需要一个字节一个字节,因此读取更大的数据 block 不是读取器接口(interface)的选项。

为此,我在 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;
}

最佳答案

很有可能是因为sfread。没有人保证它在 D 中和在 C 中做同样的事情——您很可能使用完全不同的 CRT(除非您使用的是 Digital Mars C++ 编译器?)。

这意味着图书馆可能会做同步等事情,这会减慢速度。您知道的唯一方法是通过告诉链接器链接到相同的库,强制 D 使用与 C 相同的库。

除非您能做到这一点,否则您就是在将苹果与橙子进行比较。如果这不可能,则直接从两者 调用操作系统,然后比较结果——这样可以保证两者的底层调用相同。

关于c++ - 在 D2 中读取字节的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7202710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com