Now we're on MSVC 2015, try using std::chrono for timing again.
2015's std::chrono::high_resolution_clock should have a precision equal to our old custom code. Tested this locally on Windows 10 and Mac (the two affected platforms). Long term SkTime::GetNSecs() can probably be phased out for direct <chrono> use. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1950173002 Review-Url: https://codereview.chromium.org/1950173002
This commit is contained in:
parent
b37c68ad42
commit
f2509381bd
@ -5,10 +5,10 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "SkOncePtr.h"
|
||||
#include "SkString.h"
|
||||
#include "SkTime.h"
|
||||
#include "SkTypes.h"
|
||||
#include <chrono>
|
||||
|
||||
void SkTime::DateTime::toISO8601(SkString* dst) const {
|
||||
if (dst) {
|
||||
@ -65,37 +65,8 @@ void SkTime::GetDateTime(DateTime* dt) {
|
||||
}
|
||||
#endif // SK_BUILD_FOR_WIN32
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
// TODO: try std::chrono again with MSVC 2015?
|
||||
#include <intrin.h>
|
||||
SK_DECLARE_STATIC_ONCE_PTR(double, ns_per_tick);
|
||||
double SkTime::GetNSecs() {
|
||||
uint64_t ticks = __rdtsc();
|
||||
return ticks * *ns_per_tick.get([]{
|
||||
LARGE_INTEGER khz; // The docs say this returns Hz, but it returns KHz.
|
||||
QueryPerformanceFrequency(&khz);
|
||||
return new double(1e6 / khz.QuadPart);
|
||||
});
|
||||
}
|
||||
#elif defined(__MACH__)
|
||||
// TODO: fold into std::chrono when available?
|
||||
#include <mach/mach_time.h>
|
||||
SK_DECLARE_STATIC_ONCE_PTR(double, ns_per_tick);
|
||||
double SkTime::GetNSecs() {
|
||||
uint64_t ticks = mach_absolute_time();
|
||||
return ticks * *ns_per_tick.get([]{
|
||||
mach_timebase_info_data_t timebase;
|
||||
(void)mach_timebase_info(&timebase);
|
||||
return new double(timebase.numer * 1.0 / timebase.denom);
|
||||
});
|
||||
}
|
||||
#else
|
||||
// This std::chrono code looks great on Linux and Android,
|
||||
// but MSVC 2013 returned mostly garbage (0ns times, etc).
|
||||
#include <chrono>
|
||||
double SkTime::GetNSecs() {
|
||||
auto now = std::chrono::high_resolution_clock::now();
|
||||
std::chrono::duration<double, std::nano> ns = now.time_since_epoch();
|
||||
return ns.count();
|
||||
}
|
||||
#endif
|
||||
double SkTime::GetNSecs() {
|
||||
auto now = std::chrono::high_resolution_clock::now();
|
||||
std::chrono::duration<double, std::nano> ns = now.time_since_epoch();
|
||||
return ns.count();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user