Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(398)

Unified Diff: vm/benchmark_test.h

Issue 10069039: Add infrastructure to create and run benchmarks specific to some VM functionality. This is used to … (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: vm/benchmark_test.h
===================================================================
--- vm/benchmark_test.h (revision 0)
+++ vm/benchmark_test.h (revision 0)
@@ -0,0 +1,107 @@
+// Copyright (c) 2012, 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.
+
+#ifndef VM_BENCHMARK_TEST_H_
+#define VM_BENCHMARK_TEST_H_
+
+#include "include/dart_api.h"
+
+#include "vm/dart.h"
+#include "vm/globals.h"
+#include "vm/heap.h"
+#include "vm/isolate.h"
+#include "vm/object.h"
+#include "vm/zone.h"
+
+namespace dart {
+
+// The BENCHMARK macro is used for benchmarking a specific functionality
+// of the VM
+#define BENCHMARK(name) \
+ void Dart_Benchmark##name(Benchmark* benchmark); \
+ static const Benchmark kRegister##name(Dart_Benchmark##name, #name); \
+ static void Dart_BenchmarkHelper##name(Benchmark* benchmark); \
+ void Dart_Benchmark##name(Benchmark* benchmark) { \
+ BenchmarkIsolateScope __isolate__(benchmark); \
+ Zone __zone__(benchmark->isolate()); \
+ HandleScope __hs__(benchmark->isolate()); \
+ Dart_BenchmarkHelper##name(benchmark); \
+ } \
+ static void Dart_BenchmarkHelper##name(Benchmark* benchmark)
+
+
+class Benchmark {
+ public:
+ typedef void (RunEntry)(Benchmark* benchmark);
+
+ Benchmark(RunEntry* run, const char* name) :
+ run_(run),
+ name_(name),
+ score_(0),
+ isolate_(NULL),
+ next_(NULL) {
+ if (first_ == NULL) {
+ first_ = this;
+ } else {
+ tail_->next_ = this;
+ }
+ tail_ = this;
+ }
+
+ // Accessors.
+ const char* name() const { return name_; }
+ void set_score(intptr_t value) { score_ = value; }
+ intptr_t score() const { return score_; }
+ Isolate* isolate() const { return reinterpret_cast<Isolate*>(isolate_); }
+
+ Dart_Isolate CreateIsolate(uint8_t* buffer) {
+ char* err = NULL;
+ isolate_ = Dart_CreateIsolate(NULL, buffer, NULL, &err);
+ EXPECT(isolate_ != NULL);
+ free(err);
+ return isolate_;
+ }
+
+ void Run() { (*run_)(this); }
+ void RunBenchmark();
+
+ static void RunAll();
+
+ private:
+ static Benchmark* first_;
+ static Benchmark* tail_;
+
+ RunEntry* const run_;
+ const char* name_;
+ intptr_t score_;
+ Dart_Isolate isolate_;
+ Benchmark* next_;
+
+ DISALLOW_COPY_AND_ASSIGN(Benchmark);
+};
+
+
+class BenchmarkIsolateScope {
+ public:
+ explicit BenchmarkIsolateScope(Benchmark* benchmark) : benchmark_(benchmark) {
+ benchmark_->CreateIsolate(NULL);
+ Dart_EnterScope(); // Create a Dart API scope for unit benchmarks.
+ }
+ ~BenchmarkIsolateScope() {
+ Dart_ExitScope(); // Exit the Dart API scope created for unit tests.
+ ASSERT(benchmark_->isolate() == Isolate::Current());
+ Dart_ShutdownIsolate();
+ benchmark_ = NULL;
+ }
+ Benchmark* benchmark() const { return benchmark_; }
+
+ private:
+ Benchmark* benchmark_;
+
+ DISALLOW_COPY_AND_ASSIGN(BenchmarkIsolateScope);
+};
+
+} // namespace dart
+
+#endif // VM_BENCHMARK_TEST_H_
« no previous file with comments | « bin/run_vm_tests.cc ('k') | vm/benchmark_test.cc » ('j') | vm/benchmark_test.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698