diff --git a/src/Benchmark.cpp b/src/Benchmark.cpp index eecaffec8..e449355ed 100644 --- a/src/Benchmark.cpp +++ b/src/Benchmark.cpp @@ -354,12 +354,12 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event)) srand(randSeed); - int nChunks, chunkSize; + size_t nChunks, chunkSize; //chunkSize = 7500 + (rand() % 1000); chunkSize = 200 + (rand() % 100); nChunks = (dataSize * 1048576) / (chunkSize*sizeof(short)); - while(nChunks < 20 || chunkSize > (blockSize*1024)/4) { - chunkSize = (chunkSize / 2) + (rand() % 100); + while(nChunks < 20 || chunkSize > ((unsigned long)(blockSize)*1024)/4) { + chunkSize = std::max( size_t(1), (chunkSize / 2) + (rand() % 100) ); nChunks = (dataSize * 1048576) / (chunkSize*sizeof(short)); } @@ -374,7 +374,6 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event)) int trials = numEdits; short *small1 = new short[nChunks]; - short *small2 = new short[nChunks]; short *block = new short[chunkSize]; Printf(wxT("Preparing...\n")); @@ -416,8 +415,13 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event)) timer.Start(); for (z = 0; z < trials; z++) { - int x0 = rand() % nChunks; - int xlen = 1 + (rand() % (nChunks - x0)); + // First chunk to cut + // 0 <= x0 < nChunks + const size_t x0 = rand() % nChunks; + + // Number of chunks to cut + // 1 <= xlen <= nChunks - x0 + const size_t xlen = 1 + (rand() % (nChunks - x0)); if (mEditDetail) Printf(wxT("Cut: %d - %d \n"), x0 * chunkSize, (x0 + xlen) * chunkSize); @@ -431,7 +435,10 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event)) goto fail; } - int y0 = rand() % (nChunks - xlen); + // Position to paste + // 0 <= y0 <= nChunks - xlen + const size_t y0 = rand() % (nChunks - xlen + 1); + if (mEditDetail) Printf(wxT("Paste: %d\n"), y0 * chunkSize); @@ -447,18 +454,12 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event)) t->GetClipByIndex(0)->GetSequence()->GetNumSamples().as_long_long()); goto fail; } - // Copy - for (i = 0; i < xlen; i++) - small2[i] = small1[x0 + i]; - // Delete - for (i = 0; i < (nChunks - x0 - xlen); i++) - small1[x0 + i] = small1[x0 + xlen + i]; - // Insert - for (i = 0; i < (nChunks - xlen - y0); i++) - small1[nChunks - i - 1] = small1[nChunks - i - 1 - xlen]; - // Paste - for (i = 0; i < xlen; i++) - small1[y0 + i] = small2[i]; + + // Permute small1 correspondingly to the cut and paste + auto first = &small1[0]; + if (x0 + xlen < nChunks) + std::rotate( first + x0, first + x0 + xlen, first + nChunks ); + std::rotate( first + y0, first + nChunks - xlen, first + nChunks ); } elapsed = timer.Time(); @@ -534,7 +535,6 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event)) success: delete[]small1; - delete[]small2; delete[]block; dd.reset();