[adb] file sync performance on Windows
Print not more often than once a 100ms - it is smooth enough and speeds up transfer even more on Windows, where a single line output may take up to 5ms. An added benefit is getting rid of some extra heap allocation and string formatting when in the end the identical message filtering would've dropped the line anyway. This is also significantly more expensive on Windows. Bug: 151900478 Test: manual, push/pull a file and a directory Change-Id: I9038729e8a01d5f93fd301beaeb8a086f5039b77 Merged-In: I9038729e8a01d5f93fd301beaeb8a086f5039b77
This commit is contained in:
parent
8539004821
commit
47a58ecd34
1 changed files with 16 additions and 2 deletions
|
|
@ -53,6 +53,8 @@
|
|||
#include <android-base/strings.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
|
||||
using namespace std::literals;
|
||||
|
||||
typedef void(sync_ls_cb)(unsigned mode, uint64_t size, uint64_t time, const char* name);
|
||||
|
||||
struct syncsendbuf {
|
||||
|
|
@ -112,8 +114,12 @@ struct TransferLedger {
|
|||
uint64_t bytes_transferred;
|
||||
uint64_t bytes_expected;
|
||||
bool expect_multiple_files;
|
||||
std::string last_progress_str;
|
||||
|
||||
private:
|
||||
std::string last_progress_str;
|
||||
std::chrono::steady_clock::time_point last_progress_time;
|
||||
|
||||
public:
|
||||
TransferLedger() {
|
||||
Reset();
|
||||
}
|
||||
|
|
@ -128,12 +134,13 @@ struct TransferLedger {
|
|||
}
|
||||
|
||||
void Reset() {
|
||||
last_progress_str.clear();
|
||||
start_time = std::chrono::steady_clock::now();
|
||||
files_transferred = 0;
|
||||
files_skipped = 0;
|
||||
bytes_transferred = 0;
|
||||
bytes_expected = 0;
|
||||
last_progress_str.clear();
|
||||
last_progress_time = {};
|
||||
}
|
||||
|
||||
std::string TransferRate() {
|
||||
|
|
@ -153,6 +160,12 @@ struct TransferLedger {
|
|||
|
||||
void ReportProgress(LinePrinter& lp, const std::string& file, uint64_t file_copied_bytes,
|
||||
uint64_t file_total_bytes) {
|
||||
static constexpr auto kProgressReportInterval = 100ms;
|
||||
|
||||
auto now = std::chrono::steady_clock::now();
|
||||
if (now < last_progress_time + kProgressReportInterval) {
|
||||
return;
|
||||
}
|
||||
char overall_percentage_str[5] = "?";
|
||||
if (bytes_expected != 0 && bytes_transferred <= bytes_expected) {
|
||||
int overall_percentage = static_cast<int>(bytes_transferred * 100 / bytes_expected);
|
||||
|
|
@ -186,6 +199,7 @@ struct TransferLedger {
|
|||
if (output != last_progress_str) {
|
||||
lp.Print(output, LinePrinter::LineType::INFO);
|
||||
last_progress_str = std::move(output);
|
||||
last_progress_time = now;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue