Optimise guarded memcpy (#449)

* Improve testing of memcpy including adding perf test.

* Change remaining_bytes to be branch free.

Use reciprocal division followed by multiply to remove a branch.
This commit is contained in:
Matthew Parkinson
2022-01-07 17:09:13 +00:00
committed by GitHub
parent 4ea978b946
commit 419347ba4a
4 changed files with 263 additions and 53 deletions

View File

@@ -5,17 +5,40 @@
#include <iostream>
#include <sstream>
class MeasureTime : public std::stringstream
class MeasureTime
{
std::stringstream ss;
std::chrono::time_point<std::chrono::high_resolution_clock> start =
std::chrono::high_resolution_clock::now();
bool quiet = false;
public:
~MeasureTime()
{
auto finish = std::chrono::high_resolution_clock::now();
auto diff = finish - start;
std::cout << str() << ": " << std::setw(12) << diff.count() << " ns"
<< std::endl;
if (!quiet)
{
std::cout << ss.str() << ": " << std::setw(12) << diff.count() << " ns"
<< std::endl;
}
}
MeasureTime(bool quiet = false) : quiet(quiet) {}
template<typename T>
MeasureTime& operator<<(const T& s)
{
ss << s;
start = std::chrono::high_resolution_clock::now();
return *this;
}
std::chrono::nanoseconds get_time()
{
auto finish = std::chrono::high_resolution_clock::now();
auto diff = finish - start;
return diff;
}
};