| Index: tools/parser-shell.cc
|
| diff --git a/tools/parser-shell.cc b/tools/parser-shell.cc
|
| index 4da15fc7e3e3b790db79f084a924e943c9e30060..9b0de7fb9b9a9465cfd698f373e603809d4780e7 100644
|
| --- a/tools/parser-shell.cc
|
| +++ b/tools/parser-shell.cc
|
| @@ -44,15 +44,9 @@
|
|
|
| using namespace v8::internal;
|
|
|
| -enum TestMode {
|
| - PreParseAndParse,
|
| - PreParse,
|
| - Parse
|
| -};
|
| -
|
| std::pair<TimeDelta, TimeDelta> RunBaselineParser(
|
| const char* fname, Encoding encoding, int repeat, v8::Isolate* isolate,
|
| - v8::Handle<v8::Context> context, TestMode test_mode) {
|
| + v8::Handle<v8::Context> context) {
|
| int length = 0;
|
| const byte* source = ReadFileAndRepeat(fname, &length, repeat);
|
| v8::Handle<v8::String> source_handle;
|
| @@ -73,42 +67,41 @@ std::pair<TimeDelta, TimeDelta> RunBaselineParser(
|
| break;
|
| }
|
| }
|
| - v8::ScriptData* cached_data = NULL;
|
| - TimeDelta preparse_time, parse_time;
|
| - if (test_mode == PreParseAndParse || test_mode == PreParse) {
|
| + TimeDelta parse_time1, parse_time2;
|
| + Handle<Script> script = Isolate::Current()->factory()->NewScript(
|
| + v8::Utils::OpenHandle(*source_handle));
|
| + i::ScriptDataImpl* cached_data_impl = NULL;
|
| + // First round of parsing (produce data to cache).
|
| + {
|
| + CompilationInfoWithZone info(script);
|
| + info.MarkAsGlobal();
|
| + info.SetCachedData(&cached_data_impl, i::PRODUCE_CACHED_DATA);
|
| ElapsedTimer timer;
|
| timer.Start();
|
| - cached_data = v8::ScriptData::PreCompile(source_handle);
|
| - preparse_time = timer.Elapsed();
|
| - if (cached_data == NULL || cached_data->HasError()) {
|
| - fprintf(stderr, "Preparsing failed\n");
|
| + // Allow lazy parsing; otherwise we won't produce cached data.
|
| + bool success = Parser::Parse(&info, true);
|
| + parse_time1 = timer.Elapsed();
|
| + if (!success) {
|
| + fprintf(stderr, "Parsing failed\n");
|
| return std::make_pair(TimeDelta(), TimeDelta());
|
| }
|
| }
|
| - if (test_mode == PreParseAndParse || test_mode == Parse) {
|
| - Handle<String> str = v8::Utils::OpenHandle(*source_handle);
|
| - i::Isolate* internal_isolate = str->GetIsolate();
|
| - Handle<Script> script = internal_isolate->factory()->NewScript(str);
|
| + // Second round of parsing (consume cached data).
|
| + {
|
| CompilationInfoWithZone info(script);
|
| info.MarkAsGlobal();
|
| - i::ScriptDataImpl* cached_data_impl =
|
| - static_cast<i::ScriptDataImpl*>(cached_data);
|
| - if (test_mode == PreParseAndParse) {
|
| - info.SetCachedData(&cached_data_impl,
|
| - i::CONSUME_CACHED_DATA);
|
| - }
|
| - info.SetContext(v8::Utils::OpenHandle(*context));
|
| + info.SetCachedData(&cached_data_impl, i::CONSUME_CACHED_DATA);
|
| ElapsedTimer timer;
|
| timer.Start();
|
| - // Allow lazy parsing; otherwise the preparse data won't help.
|
| + // Allow lazy parsing; otherwise cached data won't help.
|
| bool success = Parser::Parse(&info, true);
|
| - parse_time = timer.Elapsed();
|
| + parse_time2 = timer.Elapsed();
|
| if (!success) {
|
| fprintf(stderr, "Parsing failed\n");
|
| return std::make_pair(TimeDelta(), TimeDelta());
|
| }
|
| }
|
| - return std::make_pair(preparse_time, parse_time);
|
| + return std::make_pair(parse_time1, parse_time2);
|
| }
|
|
|
|
|
| @@ -116,7 +109,6 @@ int main(int argc, char* argv[]) {
|
| v8::V8::InitializeICU();
|
| v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
|
| Encoding encoding = LATIN1;
|
| - TestMode test_mode = PreParseAndParse;
|
| std::vector<std::string> fnames;
|
| std::string benchmark;
|
| int repeat = 1;
|
| @@ -127,12 +119,6 @@ int main(int argc, char* argv[]) {
|
| encoding = UTF8;
|
| } else if (strcmp(argv[i], "--utf16") == 0) {
|
| encoding = UTF16;
|
| - } else if (strcmp(argv[i], "--preparse-and-parse") == 0) {
|
| - test_mode = PreParseAndParse;
|
| - } else if (strcmp(argv[i], "--preparse") == 0) {
|
| - test_mode = PreParse;
|
| - } else if (strcmp(argv[i], "--parse") == 0) {
|
| - test_mode = Parse;
|
| } else if (strncmp(argv[i], "--benchmark=", 12) == 0) {
|
| benchmark = std::string(argv[i]).substr(12);
|
| } else if (strncmp(argv[i], "--repeat=", 9) == 0) {
|
| @@ -150,20 +136,19 @@ int main(int argc, char* argv[]) {
|
| ASSERT(!context.IsEmpty());
|
| {
|
| v8::Context::Scope scope(context);
|
| - double preparse_total = 0;
|
| - double parse_total = 0;
|
| + double first_parse_total = 0;
|
| + double second_parse_total = 0;
|
| for (size_t i = 0; i < fnames.size(); i++) {
|
| std::pair<TimeDelta, TimeDelta> time = RunBaselineParser(
|
| - fnames[i].c_str(), encoding, repeat, isolate, context, test_mode);
|
| - preparse_total += time.first.InMillisecondsF();
|
| - parse_total += time.second.InMillisecondsF();
|
| + fnames[i].c_str(), encoding, repeat, isolate, context);
|
| + first_parse_total += time.first.InMillisecondsF();
|
| + second_parse_total += time.second.InMillisecondsF();
|
| }
|
| if (benchmark.empty()) benchmark = "Baseline";
|
| - printf("%s(PreParseRunTime): %.f ms\n", benchmark.c_str(),
|
| - preparse_total);
|
| - printf("%s(ParseRunTime): %.f ms\n", benchmark.c_str(), parse_total);
|
| - printf("%s(RunTime): %.f ms\n", benchmark.c_str(),
|
| - preparse_total + parse_total);
|
| + printf("%s(FirstParseRunTime): %.f ms\n", benchmark.c_str(),
|
| + first_parse_total);
|
| + printf("%s(SecondParseRunTime): %.f ms\n", benchmark.c_str(),
|
| + second_parse_total);
|
| }
|
| }
|
| v8::V8::Dispose();
|
|
|