में बाइट्स पढ़ने का सबसे तेज तरीका है मैं एक डी 2 आवेदन में एक फ़ाइल से यथासंभव शीघ्र ही बाइट्स पढ़ना चाहते हैं। एप्लिकेशन को बाइट प्रति बाइट की आवश्यकता है, इसलिए डेटा के बड़े ब्लॉक पढ़ने से पाठक को इंटरफ़ेस का विकल्प नहीं है। https://github.com/gizmomogwai/performance:डी 2
इसके लिए मैं कम से सी ++, जावा, डी 2 में कुछ तुच्छ कार्यान्वयन बनाया।
आप देख सकते हैं मैंने कोशिश की सादा पढ़ता है, आवेदन कोड और स्मृति में बफर मैप की फ़ाइलें। मेरे उपयोग के लिए मेमोरी मैप किए गए समाधान ने सबसे अच्छा काम किया, लेकिन अजीब चीज यह है कि डी 2 जावा से धीमी है। मैं उम्मीद करता था कि सी 2+ और जावा के बीच डी 2 की भूमि होगी (सी ++ कोड -ओ 3-जी के साथ संकलित किया गया है, डी 2 कोड -ओ-रिलीज के साथ संकलित है)।
तो कृपया मुझे बताओ मैं गलत यहाँ क्या कर रहा हूँ और कैसे डी 2 कार्यान्वयन में तेजी लाने के।
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;
}
जो बहुत तेजी से विकास में "एक ही" समाधान की तुलना में है:
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;
}
मैंने डी और जावा में कुछ अन्य गैर-संबंधित कोडिंग किया है, (गणित गहन गणना), और मेरे परीक्षणों में जावा को थोड़ा तेज़ कर दिया गया है। मुझे लगता है कि आपको जावा को इतना धीमा होने की उम्मीद नहीं करनी चाहिए, जेआईटी कंपाइलर ऑप्टिमाइज़ेशन पर बहुत अच्छा है। –
हाँ ... आप सही हैं ... मैं उम्मीद नहीं करता कि जावा सीपीपी से बहुत धीमी हो (जो अभी भी मेरे डेमो उदाहरण में डिफ़ॉल्ट जिट का उपयोग कर रहा है), लेकिन मेरा मुद्दा यह है कि डी भी धीमा है। मुझे उम्मीद थी कि डी सीपी के बराबर होगा। – Gizmomogwai
हां, मैंने यह भी किया, जब मैंने कुछ महीने पहले जावा एल्गोरिदम को डी में परिवर्तित कर दिया था। मुझे लगता है कि कोड अनुकूलन में ठीक करने के लिए उनके पास कुछ quirks है। या शायद जीसी वास्तव में बुरा है, और धीमा है, तो इसे बदलने की कोशिश करें? –