diff --git a/runtime/src/main/cpp/Time.cpp b/runtime/src/main/cpp/Time.cpp new file mode 100644 index 00000000000..4ad6cbc883c --- /dev/null +++ b/runtime/src/main/cpp/Time.cpp @@ -0,0 +1,21 @@ +#include +#include "Types.h" +#include "Natives.h" + +using namespace std::chrono; + +extern "C" { + +KLong Kotlin_system_getTimeMillis() { + return duration_cast(high_resolution_clock::now().time_since_epoch()).count(); +} + +KLong Kotlin_system_getTimeNanos() { + return duration_cast(high_resolution_clock::now().time_since_epoch()).count(); +} + +KLong Kotlin_system_getTimeMicros() { + return duration_cast(high_resolution_clock::now().time_since_epoch()).count(); +} + +} // extern "C" \ No newline at end of file diff --git a/runtime/src/main/kotlin/kotlin/system/Timing.kt b/runtime/src/main/kotlin/kotlin/system/Timing.kt new file mode 100644 index 00000000000..b1a329808ce --- /dev/null +++ b/runtime/src/main/kotlin/kotlin/system/Timing.kt @@ -0,0 +1,34 @@ +package kotlin.system + +@PublishedApi +@SymbolName("Kotlin_system_getTimeMillis") +internal external fun getTimeMillis() : Long + +@PublishedApi +@SymbolName("Kotlin_system_getTimeNanos") +internal external fun getTimeNanos() : Long + +@PublishedApi +@SymbolName("Kotlin_system_getTimeMicros") +internal external fun getTimeMicros() : Long + +/** Executes the given block and returns elapsed time in milliseconds. */ +public inline fun measureTimeMillis(block: () -> Unit) : Long { + val start = getTimeMillis() + block() + return getTimeMillis() - start +} + +/** Executes the given block and returns elapsed time in microseconds (Kotlin/Native only). */ +public inline fun measureTimeMicros(block: () -> Unit) : Long { + val start = getTimeMicros() + block() + return getTimeMicros() - start +} + +/** Executes the given block and returns elapsed time in nanoseconds. */ +public inline fun measureNanoTime(block: () -> Unit) : Long { + val start = getTimeNanos() + block() + return getTimeNanos() - start +}