]> sigrok.org Git - pulseview.git/blobdiff - pv/devices/inputfile.cpp
inputfile: Increase chunk size from 16KB to 4MB.
[pulseview.git] / pv / devices / inputfile.cpp
index b866deb8245ed1d6051833f897efc2b7d59ee282..4ffd2dfa22cbc702d6ad7dfeb476042ec2d73639 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <cassert>
 #include <fstream>
+#include <vector>
 
 #include <QString>
 
@@ -30,11 +31,15 @@ using std::streamsize;
 using std::string;
 using std::ifstream;
 using std::ios;
+using std::vector;
 
 namespace pv {
 namespace devices {
 
-const streamsize InputFile::BufferSize = 16384;
+// Use a 4MB chunk size for reading a file into memory. Larger values don't
+// seem to provide any substancial performance improvements, but can cause
+// UI lag and a visually "stuttering" display of the data currently loading.
+const streamsize InputFile::BufferSize = (4 * 1024 * 1024);
 
 InputFile::InputFile(const shared_ptr<sigrok::Context> &context,
        const string &file_name,
@@ -64,13 +69,14 @@ void InputFile::open()
        // we can't open the device without sending some data first
        f = new ifstream(file_name_, ios::binary);
 
-       char buffer[BufferSize];
-       f->read(buffer, BufferSize);
+       vector<char> buffer(BufferSize);
+
+       f->read(buffer.data(), BufferSize);
        const streamsize size = f->gcount();
        if (size == 0)
                return;
 
-       input_->send(buffer, size);
+       input_->send(buffer.data(), size);
 
        try {
                device_ = input_->device();
@@ -93,22 +99,22 @@ void InputFile::start()
 
 void InputFile::run()
 {
-       char buffer[BufferSize];
-
        if (!f) {
                // Previous call to run() processed the entire file already
                f = new ifstream(file_name_, ios::binary);
                input_->reset();
        }
 
+       vector<char> buffer(BufferSize);
+
        interrupt_ = false;
        while (!interrupt_ && !f->eof()) {
-               f->read(buffer, BufferSize);
+               f->read(buffer.data(), BufferSize);
                const streamsize size = f->gcount();
                if (size == 0)
                        break;
 
-               input_->send(buffer, size);
+               input_->send(buffer.data(), size);
 
                if (size != BufferSize)
                        break;