Reviewers: xlai (Olivia), Justin Novosad, Ilya Sherman
CL:
https://codereview.chromium.org/2039673002/Message:
xlai@: could you please make sure that I place the enum histogram and the timer
in the right place?
Description:
Track performance of toBlob and its complete timeout delay
This CL does two things:
1. Track the performance of a toBlob API call. Because toBlob has a call
back, so we put a timer in the CanvasAsyncToBlob class.
2. Track how often the complete timeout delay happens in toBlob calls.
BUG=612585, 608815
Base URL:
https://chromium.googlesource.com/chromium/src.git@masterAffected files (+53, -0 lines):
M third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
M third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
M tools/metrics/histograms/histograms.xml
Index: third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
index 01136649524082b8b79b83dda662a2a4852c957e..32aa475cf162aa0828a5c3652916d23f8d0f32f8 100644
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
@@ -5,6 +5,7 @@
#include "core/html/canvas/CanvasAsyncBlobCreator.h"
#include "core/fileapi/Blob.h"
+#include "platform/Histogram.h"
#include "platform/ThreadSafeFunctional.h"
#include "platform/graphics/ImageBuffer.h"
#include "platform/image-encoders/JPEGImageEncoder.h"
@@ -94,6 +95,7 @@ CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, MimeT
m_pixelRowStride = size.width() * NumChannelsPng;
m_idleTaskStatus = IdleTaskNotSupported;
m_numRowsCompleted = 0;
+ m_startTime = WTF::monotonicallyIncreasingTime();
}
CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator()
@@ -251,6 +253,24 @@ void CanvasAsyncBlobCreator::encodeRowsJpegOnMainThread()
this->signalAlternativeCodePathFinishedForTesting();
}
+void CanvasAsyncBlobCreator::recordElapsedTime()
+{
+ double elapsedTime = WTF::monotonicallyIncreasingTime() - m_startTime;
+ if (m_mimeType == MimeTypePng) {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.PNG", 0, 10000000, 50));
+ toBlobPNGCounter.count(elapsedTime * 1000000.0);
+ } else if (m_mimeType == MimeTypeJpeg) {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.JPEG", 0, 10000000, 50));
+ toBlobJPEGCounter.count(elapsedTime * 1000000.0);
+ } else if (m_mimeType == MimeTypeWebp) {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.WEBP", 0, 10000000, 50));
+ toBlobWEBPCounter.count(elapsedTime * 1000000.0);
+ } else {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobUnknownCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.Unknown", 0, 10000000, 50));
+ toBlobUnknownCounter.count(elapsedTime * 1000000.0);
+ }
+}
+
void CanvasAsyncBlobCreator::createBlobAndInvokeCallback()
{
ASSERT(isMainThread());
@@ -260,6 +280,7 @@ void CanvasAsyncBlobCreator::createBlobAndInvokeCallback()
// non-GC members to allow teardown of CanvasAsyncBlobCreator.
m_data.clear();
m_callback.clear();
+ recordElapsedTime();
}
void CanvasAsyncBlobCreator::createNullAndInvokeCallback()
@@ -270,6 +291,7 @@ void CanvasAsyncBlobCreator::createNullAndInvokeCallback()
// clear non-GC members to allow teardown of CanvasAsyncBlobCreator.
m_data.clear();
m_callback.clear();
+ recordElapsedTime();
}
void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality)
@@ -344,6 +366,9 @@ void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent()
{
ASSERT(m_idleTaskStatus != IdleTaskNotStarted);
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, idleTaskCompleteTimeoutDelayHistogram, new EnumerationHistogram("Canvas.ToBlob.IdleTaskCompleteTimeoutDelay", NumberOfMimeTypeSupported));
+ idleTaskCompleteTimeoutDelayHistogram.count(m_mimeType);
+
if (m_idleTaskStatus == IdleTaskStarted) {
// It has taken too long to complete for the idle task.
m_idleTaskStatus = IdleTaskSwitchedToMainThreadTask;
Index: third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
index 64152fb3c0a5e14841d3073b9220150604079942..4bd048ec667318710304fde5672e8ae961ca8cb5 100644
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
@@ -73,6 +73,8 @@ private:
size_t m_pixelRowStride;
const MimeType m_mimeType;
CrossThreadPersistent<BlobCallback> m_callback;
+ double m_startTime;
+ void recordElapsedTime();
// PNG
bool initializePngStruct();
Index: tools/metrics/histograms/histograms.xml
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index eeea9193acb9d4e9a4283bcdc7b6759c2d6d35be..42f37a99172d2f420bb70bec2ef81b07c01149b3 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -3478,6 +3478,11 @@
http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
<summary>Time spent on 2D canvas putImageData API call.</summary>
</histogram>
+<histogram name="Blink.Canvas.ToBlob" units="microseconds">
+ <
owner>ju...@chromium.org</owner>
+ <summary>Time spent on 2D canvas toBlob API call.</summary>
+</histogram>
+
<histogram name="Blink.Canvas.ToDataURL" units="microseconds">
<
owner>ju...@chromium.org</owner>
<summary>Time spent on 2D canvas toDataURL API call.</summary>
@@ -4336,6 +4341,13 @@
http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
+<histogram name="Canvas.ToBlob.IdleTaskCompleteTimeoutDelay" enum="MimeType">
+ <
owner>xl...@chromium.org</owner>
+ <summary>
+ Records the occurence of complete time out delay in canvas toBlob calls.
+ </summary>
+</histogram>
+
<histogram name="CAPSUpdater.Step" enum="CAPSUpdaterStep">
<
owner>c...@chromium.org</owner>
<summary>
@@ -80730,6 +80742,12 @@ To add a new entry, add it with any value and run test to compute valid value.
<int value="2" label="IPsec"/>
</enum>
+<enum name="MimeType" type="int">
+ <int value="0" label="Png"/>
+ <int value="1" label="Jpeg"/>
+ <int value="2" label="Webp"/>
+</enum>
+
<enum name="MissingStartType" type="int">
<int value="0" label="Nothing missing"/>
<int value="1" label="Start missing"/>
@@ -91812,6 +91830,14 @@ To add a new entry, add it with any value and run test to compute valid value.
<affected-histogram name="Blink.Canvas.PutImageData"/>
</histogram_suffixes>
+<histogram_suffixes name="BlinkCanvasToBlobTime" separator=".">
+ <suffix name="JPEG"/>
+ <suffix name="PNG"/>
+ <suffix name="Unknown"/>
+ <suffix name="WEBP"/>
+ <affected-histogram name="Blink.Canvas.ToBlob"/>
+</histogram_suffixes>
+
<histogram_suffixes name="BlinkCanvasToDataURLTime" separator=".">
<suffix name="BMP"/>
<suffix name="GIF"/>