14a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com/* 24a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * Copyright 2013 Google Inc. 34a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * 44a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 54a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * found in the LICENSE file. 64a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com */ 74a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 94a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com#include "SkCanvas.h" 104a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com#include "SkPaint.h" 114a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com#include "SkRandom.h" 124a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 134a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com/** 144a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * This is a conversion of samplecode/SampleChart.cpp into a bench. It sure would be nice to be able 154a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * to write one subclass that can be a GM, bench, and/or Sample. 164a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com */ 174a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 184a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// Generates y values for the chart plots. 198a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.orgstatic void gen_data(SkScalar yAvg, SkScalar ySpread, int count, 208a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org SkRandom* random, SkTDArray<SkScalar>* dataPts) { 214a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com dataPts->setCount(count); 224a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com for (int i = 0; i < count; ++i) { 238a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org (*dataPts)[i] = random->nextRangeScalar(yAvg - SkScalarHalf(ySpread), 244a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com yAvg + SkScalarHalf(ySpread)); 254a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 264a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com} 274a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 284a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// Generates a path to stroke along the top of each plot and a fill path for the area below each 294a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// plot. The fill path is bounded below by the bottomData plot points or a horizontal line at 304a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// yBase if bottomData == NULL. 314a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// The plots are animated by rotating the data points by leftShift. 3297b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.orgstatic void gen_paths(const SkTDArray<SkScalar>& topData, 3397b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org const SkTDArray<SkScalar>* bottomData, 3497b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org SkScalar yBase, 3597b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org SkScalar xLeft, SkScalar xDelta, 3697b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org int leftShift, 3797b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org SkPath* plot, SkPath* fill) { 384a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plot->rewind(); 394a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->rewind(); 404a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plot->incReserve(topData.count()); 414a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com if (NULL == bottomData) { 424a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->incReserve(topData.count() + 2); 434a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } else { 444a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->incReserve(2 * topData.count()); 454a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 464a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 474a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com leftShift %= topData.count(); 484a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkScalar x = xLeft; 494a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 504a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com // Account for the leftShift using two loops 514a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com int shiftToEndCount = topData.count() - leftShift; 524a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plot->moveTo(x, topData[leftShift]); 534a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->moveTo(x, topData[leftShift]); 544a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 554a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com for (int i = 1; i < shiftToEndCount; ++i) { 564a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plot->lineTo(x, topData[i + leftShift]); 574a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->lineTo(x, topData[i + leftShift]); 584a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com x += xDelta; 594a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 604a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 614a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com for (int i = 0; i < leftShift; ++i) { 624a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plot->lineTo(x, topData[i]); 634a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->lineTo(x, topData[i]); 644a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com x += xDelta; 654a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 664a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 6749f085dddff10473b6ebf832a974288300224e60bsalomon if (bottomData) { 684a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkASSERT(bottomData->count() == topData.count()); 694a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com // iterate backwards over the previous graph's data to generate the bottom of the filled 704a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com // area (and account for leftShift). 714a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com for (int i = 0; i < leftShift; ++i) { 724a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com x -= xDelta; 734a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->lineTo(x, (*bottomData)[leftShift - 1 - i]); 744a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 754a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com for (int i = 0; i < shiftToEndCount; ++i) { 764a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com x -= xDelta; 774a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->lineTo(x, (*bottomData)[bottomData->count() - 1 - i]); 784a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 794a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } else { 804a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->lineTo(x - xDelta, yBase); 814a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fill->lineTo(xLeft, yBase); 824a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 834a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com} 844a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 854a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// A set of scrolling line plots with the area between each plot filled. Stresses out GPU path 864a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// filling 87f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ChartBench : public Benchmark { 884a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.compublic: 89410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ChartBench(bool aa) { 904a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fShift = 0; 914a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fAA = aa; 92cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com fSize.fWidth = -1; 93cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com fSize.fHeight = -1; 944a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 954a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 964a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.comprotected: 974a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com virtual const char* onGetName() SK_OVERRIDE { 984a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com if (fAA) { 994a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com return "chart_aa"; 1004a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } else { 1014a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com return "chart_bw"; 1024a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 1034a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 1044a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1053361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 1064a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com bool sizeChanged = false; 1074a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com if (canvas->getDeviceSize() != fSize) { 1084a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fSize = canvas->getDeviceSize(); 1094a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com sizeChanged = true; 1104a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 1114a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1124a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkScalar ySpread = SkIntToScalar(fSize.fHeight / 20); 1134a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1144a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkScalar height = SkIntToScalar(fSize.fHeight); 115cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com if (sizeChanged) { 116cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com int dataPointCount = SkMax32(fSize.fWidth / kPixelsPerTick + 1, 2); 1174a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1188a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org SkRandom random; 119cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com for (int i = 0; i < kNumGraphs; ++i) { 120cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com SkScalar y = (kNumGraphs - i) * (height - ySpread) / (kNumGraphs + 1); 121cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com fData[i].reset(); 1228a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org gen_data(y, ySpread, dataPointCount, &random, fData + i); 1234a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 124cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com } 125cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com 1268a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org SkRandom colorRand; 1278a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org SkColor colors[kNumGraphs]; 1288a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org for (int i = 0; i < kNumGraphs; ++i) { 1298a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org colors[i] = colorRand.nextU() | 0xff000000; 1308a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org } 1318a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org 1323361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int frame = 0; frame < loops; ++frame) { 1334a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1344a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com canvas->clear(0xFFE0F0E0); 1354a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1364a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkPath plotPath; 1374a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkPath fillPath; 1384a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1394a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com static const SkScalar kStrokeWidth = SkIntToScalar(2); 1404a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkPaint plotPaint; 1414a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkPaint fillPaint; 1424a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plotPaint.setAntiAlias(fAA); 1434a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plotPaint.setStyle(SkPaint::kStroke_Style); 1444a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plotPaint.setStrokeWidth(kStrokeWidth); 1454a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plotPaint.setStrokeCap(SkPaint::kRound_Cap); 1464a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com plotPaint.setStrokeJoin(SkPaint::kRound_Join); 1474a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fillPaint.setAntiAlias(fAA); 1484a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fillPaint.setStyle(SkPaint::kFill_Style); 1494a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1504a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkTDArray<SkScalar>* prevData = NULL; 1514a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com for (int i = 0; i < kNumGraphs; ++i) { 1524a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com gen_paths(fData[i], 1534a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com prevData, 1544a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com height, 1554a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 0, 1564a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkIntToScalar(kPixelsPerTick), 1574a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fShift, 1584a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com &plotPath, 1594a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com &fillPath); 1604a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1614a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com // Make the fills partially transparent 1628a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org fillPaint.setColor((colors[i] & 0x00ffffff) | 0x80000000); 1634a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com canvas->drawPath(fillPath, fillPaint); 1644a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1658a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org plotPaint.setColor(colors[i]); 1664a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com canvas->drawPath(plotPath, plotPaint); 1674a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1684a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com prevData = fData + i; 1694a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 1704a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1714a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com fShift += kShiftPerFrame; 1724a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 1734a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com } 1744a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1754a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.comprivate: 1764a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com enum { 1774a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com kNumGraphs = 5, 1784a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com kPixelsPerTick = 3, 1794a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com kShiftPerFrame = 1, 1804a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com }; 1814a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com int fShift; 1824a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkISize fSize; 1834a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com SkTDArray<SkScalar> fData[kNumGraphs]; 1844a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com bool fAA; 1854a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 186f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 1874a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com}; 1884a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 1894a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com////////////////////////////////////////////////////////////////////////////// 1904a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com 191410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ChartBench(true); ) 192410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ChartBench(false); ) 193