blob: 95a8f5404269b63f7d2c2f5e589425146f1b3f08 [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import '../tool/_fasta/entry_points.dart' show compileEntryPoint;
Future<void> main(List<String> arguments) async {
await compileEntryPoint(arguments);
if (numCalls.isNotEmpty) {
print("[");
bool printed = false;
for (int i = 0; i < numCalls.length; i++) {
int? value = numCalls[i];
if (value != null && value > 0) {
if (printed) print(",");
print("$i, $value");
printed = true;
}
}
print("]");
} else if (inCall.isNotEmpty) {
print("[");
bool printed = false;
for (int i = 0; i < inCall.length; i++) {
int? value = inCall[i];
if (value == null) continue;
if (value != 0) throw "$i has value $value";
if (printed) print(",");
int? time = callTimes[i];
print("$i, $time");
printed = true;
}
print("]");
}
}
List<int?> numCalls = [];
void registerCall(int procedureNum) {
while (numCalls.length <= procedureNum) {
if (numCalls.length < 8) {
numCalls.length = 8;
} else {
numCalls.length *= 2;
}
}
int numCallsCount = numCalls[procedureNum] ??= 0;
numCalls[procedureNum] = numCallsCount + 1;
}
List<int?> inCall = [];
List<int?> callTimes = [];
Stopwatch stopwatch = new Stopwatch()..start();
void registerCallStart(int procedureNum) {
while (inCall.length <= procedureNum) {
if (inCall.length < 8) {
inCall.length = 8;
callTimes.length = 8;
} else {
inCall.length *= 2;
callTimes.length *= 2;
}
}
int inCallCount = inCall[procedureNum] ??= 0;
int callTimesCount = callTimes[procedureNum] ??= 0;
inCall[procedureNum] = inCallCount + 1;
if (inCallCount == 0) {
// First --- start a timer-ish.
callTimes[procedureNum] = callTimesCount - stopwatch.elapsedMicroseconds;
}
}
void registerCallEnd(int procedureNum) {
int inCallCount = inCall[procedureNum]!;
inCall[procedureNum] = inCallCount - 1;
if (inCallCount == 1) {
// Last --- stop the timer-ish.
callTimes[procedureNum] =
callTimes[procedureNum]! + stopwatch.elapsedMicroseconds;
}
}
@pragma("vm:prefer-inline")
void preferInlineMe() {
// This makes it easier to get the annotation :).
}
int busyWait(int micro) {
int count = 0;
Stopwatch stopwatch = new Stopwatch()..start();
while (true) {
for (int i = 0; i < 1000; i++) {
count++;
}
int elapsed = stopwatch.elapsedMicroseconds;
if (elapsed >= micro) {
print("Bye from busywait after $count iterations ($elapsed vs $micro)!");
return count;
}
}
}