|
@ -4,10 +4,71 @@ |
|
|
-compile({inline_size, 128}). |
|
|
-compile({inline_size, 128}). |
|
|
|
|
|
|
|
|
-export([ |
|
|
-export([ |
|
|
ts/4 |
|
|
|
|
|
|
|
|
tc/1 |
|
|
|
|
|
, tc/2 |
|
|
|
|
|
, tc/3 |
|
|
|
|
|
, ts/4 |
|
|
, tm/5 |
|
|
, tm/5 |
|
|
|
|
|
, test/1 |
|
|
]). |
|
|
]). |
|
|
|
|
|
|
|
|
|
|
|
%% Measure the execution time (in nanoseconds) for Fun(). |
|
|
|
|
|
-spec tc(Fun :: function()) -> {Time :: integer(), Value :: term()}. |
|
|
|
|
|
tc(F) -> |
|
|
|
|
|
T1 = erlang:monotonic_time(), |
|
|
|
|
|
Val = F(), |
|
|
|
|
|
T2 = erlang:monotonic_time(), |
|
|
|
|
|
Time = cvrTimeUnit(T2 - T1, native, nanosecond), |
|
|
|
|
|
{Time, Val}. |
|
|
|
|
|
|
|
|
|
|
|
%% Measure the execution time (in nanoseconds) for Fun(Args). |
|
|
|
|
|
-spec tc(Fun :: function(), Arguments :: [term()]) -> {Time :: integer(), Value :: term()}. |
|
|
|
|
|
tc(F, A) -> |
|
|
|
|
|
T1 = erlang:monotonic_time(), |
|
|
|
|
|
Val = apply(F, A), |
|
|
|
|
|
T2 = erlang:monotonic_time(), |
|
|
|
|
|
Time = cvrTimeUnit(T2 - T1, native, nanosecond), |
|
|
|
|
|
{Time, Val}. |
|
|
|
|
|
|
|
|
|
|
|
%% Measure the execution time (in nanoseconds) for an MFA. |
|
|
|
|
|
-spec tc(Module :: module(), Function :: atom(), Arguments :: [term()]) -> {Time :: integer(), Value :: term()}. |
|
|
|
|
|
tc(M, F, A) -> |
|
|
|
|
|
T1 = erlang:monotonic_time(), |
|
|
|
|
|
Val = apply(M, F, A), |
|
|
|
|
|
T2 = erlang:monotonic_time(), |
|
|
|
|
|
Time = cvrTimeUnit(T2 - T1, native, nanosecond), |
|
|
|
|
|
{Time, Val}. |
|
|
|
|
|
|
|
|
|
|
|
-spec cvrTimeUnit(Time :: integer(), FromUnit :: time_unit(), ToUnit :: time_unit()) -> ConvertedTime :: integer(). |
|
|
|
|
|
cvrTimeUnit(Time, FromUnit, ToUnit) -> |
|
|
|
|
|
try |
|
|
|
|
|
FU = |
|
|
|
|
|
case FromUnit of |
|
|
|
|
|
native -> erts_internal:time_unit(); |
|
|
|
|
|
perf_counter -> erts_internal:perf_counter_unit(); |
|
|
|
|
|
nanosecond -> 1000 * 1000 * 1000; |
|
|
|
|
|
microsecond -> 1000 * 1000; |
|
|
|
|
|
millisecond -> 1000; |
|
|
|
|
|
second -> 1 |
|
|
|
|
|
end, |
|
|
|
|
|
TU = |
|
|
|
|
|
case ToUnit of |
|
|
|
|
|
native -> erts_internal:time_unit(); |
|
|
|
|
|
perf_counter -> erts_internal:perf_counter_unit(); |
|
|
|
|
|
nanosecond -> 1000 * 1000 * 1000; |
|
|
|
|
|
microsecond -> 1000 * 1000; |
|
|
|
|
|
millisecond -> 1000; |
|
|
|
|
|
second -> 1 |
|
|
|
|
|
end, |
|
|
|
|
|
case Time < 0 of |
|
|
|
|
|
true -> (TU * Time - (FU - 1)) div FU; |
|
|
|
|
|
_ -> TU * Time div FU |
|
|
|
|
|
end |
|
|
|
|
|
catch |
|
|
|
|
|
_ : _ -> |
|
|
|
|
|
erlang:error(badarg, [Time, FromUnit, ToUnit]) |
|
|
|
|
|
end. |
|
|
|
|
|
|
|
|
%% 单进程循环测试:LoopTimes是循环次数 |
|
|
%% 单进程循环测试:LoopTimes是循环次数 |
|
|
%% utTc:ts(LoopTimes, Module, Function, ArgsList). |
|
|
%% utTc:ts(LoopTimes, Module, Function, ArgsList). |
|
|
%% 多进程并发测试:SpawnProcessesCount是并发的进程数 LoopTimes是循环次数 |
|
|
%% 多进程并发测试:SpawnProcessesCount是并发的进程数 LoopTimes是循环次数 |
|
@ -137,4 +198,17 @@ loopTm(LoopTime, M, F, A, SumTime) -> |
|
|
Microsecond = doTc(M, F, A), |
|
|
Microsecond = doTc(M, F, A), |
|
|
loopTm(LoopTime - 1, M, F, A, SumTime + Microsecond). |
|
|
loopTm(LoopTime - 1, M, F, A, SumTime + Microsecond). |
|
|
|
|
|
|
|
|
|
|
|
test(N) -> |
|
|
|
|
|
M1 = erlang:monotonic_time(), |
|
|
|
|
|
timer:sleep(N), |
|
|
|
|
|
M2 = erlang:monotonic_time(), |
|
|
|
|
|
Time = cvrTimeUnit(M2 - M1, native, nanosecond), |
|
|
|
|
|
io:format("IMY******************111 ~p~n", [Time]), |
|
|
|
|
|
|
|
|
|
|
|
S1 = erlang:system_time(nanosecond), |
|
|
|
|
|
timer:sleep(N), |
|
|
|
|
|
S2 = erlang:system_time(nanosecond), |
|
|
|
|
|
io:format("IMY******************222 ~p~n", [S2 - S1]). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|