Buckets:
| // Copyright 2017 The Emscripten Authors. All rights reserved. | |
| // Emscripten is available under two separate licenses, the MIT license and the | |
| // University of Illinois/NCSA Open Source License. Both these licenses can be | |
| // found in the LICENSE file. | |
| char dst[1024*1024*64+16] = {}; | |
| uint8_t resultCheckSum = 0; | |
| void __attribute__((noinline)) test_memset(int numTimes, int copySize) | |
| { | |
| for(int i = 0; i < numTimes - 8; i += 8) | |
| { | |
| memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1]; | |
| memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1]; | |
| memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1]; | |
| memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1]; | |
| memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1]; | |
| memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1]; | |
| memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1]; | |
| memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1]; | |
| } | |
| numTimes &= 15; | |
| for(int i = 0; i < numTimes; ++i) | |
| { | |
| memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1]; | |
| } | |
| } | |
| std::vector<int> copySizes; | |
| std::vector<double> results; | |
| std::vector<int> testCases; | |
| double totalTimeSecs = 0.0; | |
| void test_case(int copySize) | |
| { | |
| const int minimumCopyBytes = 1024*1024*64; | |
| int numTimes = (minimumCopyBytes + copySize-1) / copySize; | |
| if (numTimes < 8) numTimes = 8; | |
| tick_t bestResult = 1e9; | |
| for(int i = 0; i < NUM_TRIALS; ++i) | |
| { | |
| double t0 = tick(); | |
| test_memset(numTimes, copySize); | |
| double t1 = tick(); | |
| if (t1 - t0 < bestResult) bestResult = t1 - t0; | |
| totalTimeSecs += (double)(t1 - t0) / ticks_per_sec(); | |
| } | |
| unsigned long long totalBytesTransferred = numTimes * copySize; | |
| copySizes.push_back(copySize); | |
| tick_t ticksElapsed = bestResult; | |
| if (ticksElapsed > 0) | |
| { | |
| double seconds = (double)ticksElapsed / ticks_per_sec(); | |
| double bytesPerSecond = totalBytesTransferred / seconds; | |
| double mbytesPerSecond = bytesPerSecond / (1024.0*1024.0); | |
| results.push_back(mbytesPerSecond); | |
| } | |
| else | |
| { | |
| results.push_back(0.0); | |
| } | |
| } | |
| void print_results() | |
| { | |
| std::cout << "Test cases: " << std::endl; | |
| for(size_t i = 0; i < copySizes.size(); ++i) | |
| { | |
| std::cout << copySizes[i]; | |
| if (i != copySizes.size()-1) std::cout << ","; | |
| else std::cout << std::endl; | |
| if (i % 10 == 9) std::cout << std::endl; | |
| } | |
| std::cout << std::endl; | |
| std::cout << std::endl; | |
| std::cout << std::endl; | |
| std::cout << "Test results: " << std::endl; | |
| for(size_t i = 0; i < results.size(); ++i) | |
| { | |
| std::cout << results[i]; | |
| if (i != results.size()-1) std::cout << ","; | |
| else std::cout << std::endl; | |
| if (i % 10 == 9) std::cout << std::endl; | |
| } | |
| std::cout << "Result checksum: " << (int)resultCheckSum << std::endl; | |
| std::cout << "Total time: " << totalTimeSecs << std::endl; | |
| } | |
| int numDone = 0; | |
| void run_one() | |
| { | |
| std::cout << (numDone+1) << "/" << (numDone+testCases.size()) << std::endl; | |
| ++numDone; | |
| int copySize = testCases.front(); | |
| testCases.erase(testCases.begin()); | |
| test_case(copySize); | |
| } | |
| void main_loop() | |
| { | |
| if (!testCases.empty()) | |
| { | |
| run_one(); | |
| } | |
| else | |
| { | |
| emscripten_cancel_main_loop(); | |
| print_results(); | |
| } | |
| } | |
| int main() | |
| { | |
| for(int copySizeI = MIN_COPY; copySizeI < MAX_COPY; copySizeI <<= 1) | |
| for(int copySizeJ = 1; copySizeJ <= copySizeI; copySizeJ <<= 1) | |
| { | |
| testCases.push_back(copySizeI | copySizeJ); | |
| } | |
| std::sort(testCases.begin(), testCases.end()); | |
| emscripten_set_main_loop(main_loop, 0, 0); | |
| while(!testCases.empty()) run_one(); | |
| print_results(); | |
| } | |
Xet Storage Details
- Size:
- 4.11 kB
- Xet hash:
- 1eb0099528e50f51a54df3d873c31375f77808f33a0f6e57947608b05984af48
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.