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:
mtklein 2016-05-04 14:02:14 -07:00 committed by Commit bot
parent b37c68ad42
commit f2509381bd

View File

@ -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();
}