devirt-want: vcall -> constant for all but one, and direct call for one type |
||||
Issue descriptionapproximateOpCount is called from DrawingDisplayItem::ApproximateOpCount and shows a visible overhead due to slow virtual calls: https://cs.chromium.org/chromium/src/third_party/skia/include/core/SkPicture.h?sq=package:chromium&dr=CSs&rcl=1471276009&l=145 The implementations: SkEmptyPicture::approximateOpCount() { return 0; } SkMiniPicture::approximateOpCount() { return 1; } SkBigPicture::approximateOpCount() { return fRecord->count(); } and the last one is actually equivalent to return fRecord->fCount. This can be turned into a simple type switch, similar to https://crbug.com/638060
,
Aug 18 2016
One more case: SkBitmapDevice::onAccessPixels: https://cs.chromium.org/chromium/src/third_party/skia/include/core/SkDevice.h?sq=package:chromium&dr=CSs&rcl=1471534131&l=292 Implementations: bool SkDevice::onAccessPixels(SkPixmap*) { return false; } bool SkGpuDevice::onAccessPixels(SkPixmap* pmap) { ASSERT_SINGLE_OWNER // debug only return false; } bool SkBitmapDevice::onAccessPixels(SkPixmap* pmap) { if (this->onPeekPixels(pmap)) { fBitmap.notifyPixelsChanged(); return true; } return false; } Once again, it's simple rewrite: if vptr == SkBitmapDevice { direct call SkBitmapDevice::onAccessPixels } else { constant false }
,
Aug 18 2016
,
Aug 18 2016
,
Aug 1
|
||||
►
Sign in to add a comment |
||||
Comment 1 by krasin@chromium.org
, Aug 18 2016Another similar case is SkPicture::approximateBytesUsed. It has three implementations: size_t SkEmptyPicture::approximateBytesUsed() const override { return sizeof(*this); } size_t SkMiniPicture::approximateBytesUsed() const override { return sizeof(*this); } size_t SkBigPicture::approximateBytesUsed() const { size_t bytes = sizeof(*this) + fRecord->bytesUsed() + fApproxBytesUsedBySubPictures; if (fBBH) { bytes += fBBH->bytesUsed(); } return bytes; } This can be devirtualized to: if vptr == SkBigPicture { direct call SkBigPicture::approximateBytesUsed } else { read virtual const from vtable // sizeof(*this) }