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

Unified Diff: third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp

Issue 2039673002: Track performance of toBlob and its complete timeout delay (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor clean up Created 4 years, 6 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: 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..b5f26dd0a417202c5fcf39cf20cd357b647151d3 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"
@@ -78,16 +79,17 @@ CanvasAsyncBlobCreator::MimeType convertMimeTypeStringToEnum(const String& mimeT
} // anonymous namespace
-CanvasAsyncBlobCreator* CanvasAsyncBlobCreator::create(DOMUint8ClampedArray* unpremultipliedRGBAImageData, const String& mimeType, const IntSize& size, BlobCallback* callback)
+CanvasAsyncBlobCreator* CanvasAsyncBlobCreator::create(DOMUint8ClampedArray* unpremultipliedRGBAImageData, const String& mimeType, const IntSize& size, BlobCallback* callback, double startTime)
{
- return new CanvasAsyncBlobCreator(unpremultipliedRGBAImageData, convertMimeTypeStringToEnum(mimeType), size, callback);
+ return new CanvasAsyncBlobCreator(unpremultipliedRGBAImageData, convertMimeTypeStringToEnum(mimeType), size, callback, startTime);
}
-CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, MimeType mimeType, const IntSize& size, BlobCallback* callback)
+CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, MimeType mimeType, const IntSize& size, BlobCallback* callback, double startTime)
: m_data(data)
, m_size(size)
, m_mimeType(mimeType)
, m_callback(callback)
+ , m_startTime(startTime)
{
ASSERT(m_data->length() == (unsigned) (size.height() * size.width() * 4));
m_encodedImage = adoptPtr(new Vector<unsigned char>());
@@ -118,7 +120,8 @@ void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodSche
}
// We post the below task to check if the above idle task isn't late.
// There's no risk of concurrency as both tasks are on main thread.
- this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent, this, quality), IdleTaskStartTimeoutDelay);
+ double startTime = WTF::monotonicallyIncreasingTime();
+ this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent, this, quality, startTime), IdleTaskStartTimeoutDelay);
} else if (m_mimeType == MimeTypeWebp) {
BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.width() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTask : BackgroundTaskRunner::TaskSizeShortRunningTask;
BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafeBind(&CanvasAsyncBlobCreator::encodeImageOnEncoderThread, wrapCrossThreadPersistent(this), quality), taskSize);
@@ -260,6 +263,17 @@ void CanvasAsyncBlobCreator::createBlobAndInvokeCallback()
// non-GC members to allow teardown of CanvasAsyncBlobCreator.
m_data.clear();
m_callback.clear();
+ 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 {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.WEBP", 0, 10000000, 50));
+ toBlobWEBPCounter.count(elapsedTime * 1000000.0);
+ }
}
void CanvasAsyncBlobCreator::createNullAndInvokeCallback()
@@ -305,11 +319,35 @@ bool CanvasAsyncBlobCreator::initializeJpegStruct(double quality)
return true;
}
-void CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent(double quality)
+void CanvasAsyncBlobCreator::recordTimeoutSwitch(IdleTaskTimeoutType type)
+{
+ if (m_mimeType == MimeTypePng) {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, idleTaskTimeoutSwitchPNG, new EnumerationHistogram("Canvas.ToBlob.IdleTaskTimeoutSwitch.PNG", IdleTaskTimeoutSupported));
+ idleTaskTimeoutSwitchPNG.count(type);
+ } else {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, idleTaskTimeoutSwitchJPEG, new EnumerationHistogram("Canvas.ToBlob.IdleTaskTimeoutSwitch.JPEG", IdleTaskTimeoutSupported));
+ idleTaskTimeoutSwitchJPEG.count(type);
+ }
+}
+
+void CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent(double quality, double startTime)
{
+ double elapsedTime = WTF::monotonicallyIncreasingTime() - startTime;
+ if (m_mimeType == MimeTypePng) {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGStartTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.PNG.Start", 0, 10000000, 50));
+ toBlobPNGStartTimeoutCounter.count(elapsedTime * 1000000.0);
+ } else if (m_mimeType == MimeTypeJpeg) {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGStartTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.JPEG.Start", 0, 10000000, 50));
+ toBlobJPEGStartTimeoutCounter.count(elapsedTime * 1000000.0);
+ } else {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPStartTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.WEBP.Start", 0, 10000000, 50));
+ toBlobWEBPStartTimeoutCounter.count(elapsedTime * 1000000.0);
+ }
xidachen 2016/06/07 20:46:29 Is this recording meaningful now that we change to
+
if (m_idleTaskStatus == IdleTaskStarted) {
// Even if the task started quickly, we still want to ensure completion
- this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent, this), IdleTaskCompleteTimeoutDelay);
+ startTime = WTF::monotonicallyIncreasingTime();
+ this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent, this, startTime), IdleTaskCompleteTimeoutDelay);
} else if (m_idleTaskStatus == IdleTaskNotStarted) {
// If the idle task does not start after a delay threshold, we will
// force it to happen on main thread (even though it may cause more
@@ -319,6 +357,7 @@ void CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent(double quality)
if (m_mimeType == MimeTypePng) {
if (initializePngStruct()) {
+ recordTimeoutSwitch(IdleTaskStartTimeout);
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::encodeRowsPngOnMainThread, this));
} else {
// Failing in initialization of png struct
@@ -327,6 +366,7 @@ void CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent(double quality)
} else {
ASSERT(m_mimeType == MimeTypeJpeg);
if (initializeJpegStruct(quality)) {
+ recordTimeoutSwitch(IdleTaskStartTimeout);
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::encodeRowsJpegOnMainThread, this));
} else {
// Failing in initialization of jpeg struct
@@ -340,9 +380,20 @@ void CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent(double quality)
}
-void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent()
+void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent(double startTime)
{
ASSERT(m_idleTaskStatus != IdleTaskNotStarted);
+ double elapsedTime = WTF::monotonicallyIncreasingTime() - startTime;
+ if (m_mimeType == MimeTypePng) {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCompleteTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.PNG.Complete", 0, 10000000, 50));
+ toBlobPNGCompleteTimeoutCounter.count(elapsedTime * 1000000.0);
+ } else if (m_mimeType == MimeTypeJpeg) {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGCompleteTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.JPEG.Complete", 0, 10000000, 50));
+ toBlobJPEGCompleteTimeoutCounter.count(elapsedTime * 1000000.0);
+ } else {
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCompleteTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.WEBP.Complete", 0, 10000000, 50));
+ toBlobWEBPCompleteTimeoutCounter.count(elapsedTime * 1000000.0);
+ }
if (m_idleTaskStatus == IdleTaskStarted) {
// It has taken too long to complete for the idle task.
@@ -350,9 +401,11 @@ void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent()
signalTaskSwitchInCompleteTimeoutEventForTesting();
if (m_mimeType == MimeTypePng) {
+ recordTimeoutSwitch(IdleTaskCompleteTimeout);
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::encodeRowsPngOnMainThread, this));
} else {
ASSERT(m_mimeType == MimeTypeJpeg);
+ recordTimeoutSwitch(IdleTaskCompleteTimeout);
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::encodeRowsJpegOnMainThread, this));
}
} else {

Powered by Google App Engine
This is Rietveld 408576698