multi-threaded file copy (2.5x speed improvement for sd -> hdd).

This commit is contained in:
ITotalJustice
2025-05-28 15:25:50 +01:00
parent 6b01735655
commit 36c8a60de0

View File

@@ -4,6 +4,7 @@
#include "app.hpp" #include "app.hpp"
#include "defines.hpp" #include "defines.hpp"
#include "log.hpp" #include "log.hpp"
#include "threaded_file_transfer.hpp"
#include "i18n.hpp" #include "i18n.hpp"
#include <cstring> #include <cstring>
@@ -270,39 +271,28 @@ auto ProgressBox::CopyFile(fs::Fs* fs_src, fs::Fs* fs_dst, const fs::FsPath& src
fs::File dst_file; fs::File dst_file;
R_TRY(fs_dst->OpenFile(dst_path, FsOpenMode_Write, &dst_file)); R_TRY(fs_dst->OpenFile(dst_path, FsOpenMode_Write, &dst_file));
R_TRY(dst_file.SetSize(src_size)); R_TRY(dst_file.SetSize(src_size));
s64 offset{}; R_TRY(thread::Transfer(this, src_size,
std::vector<u8> buf; [&](void* data, s64 off, s64 size, u64* bytes_read) -> Result {
const auto rc = src_file.Read(off, data, size, 0, bytes_read);
if (is_file_based_emummc) {
buf.resize(1024*512); // 512KiB
} else {
buf.resize(1024*1024*4); // 4MiB
}
while (offset < src_size) {
R_TRY(ShouldExitResult());
u64 bytes_read;
R_TRY(src_file.Read(offset, buf.data(), buf.size(), 0, &bytes_read));
Yield();
if (is_both_native && is_file_based_emummc) { if (is_both_native && is_file_based_emummc) {
svcSleepThread(2e+6); // 2ms svcSleepThread(2e+6); // 2ms
} }
R_TRY(dst_file.Write(offset, buf.data(), bytes_read, FsWriteOption_None)); return rc;
Yield(); },
[&](const void* data, s64 off, s64 size) -> Result {
UpdateTransfer(offset, src_size); const auto rc = dst_file.Write(off, data, size, 0);
offset += bytes_read;
if (is_both_native && is_file_based_emummc) { if (is_both_native && is_file_based_emummc) {
svcSleepThread(2e+6); // 2ms svcSleepThread(2e+6); // 2ms
} }
return rc;
} }
));
R_SUCCEED(); R_SUCCEED();
} }