Bug 1757833 - Add PerfStat probes for bytecode cache reads, writes, compression, and decompression r=nbp,necko-reviewers,kershaw

Differential Revision: https://phabricator.services.mozilla.com/D145012
This commit is contained in:
Bryan Thrall 2022-05-20 18:25:42 +00:00
parent 93bf2e27d6
commit edc0fa2360
5 changed files with 31 additions and 1 deletions

View file

@ -7,6 +7,7 @@
#include "zlib.h"
#include "ScriptLoadRequest.h"
#include "ScriptLoader.h"
#include "mozilla/PerfStats.h"
#include "mozilla/ProfilerMarkers.h"
#include "mozilla/Vector.h"
#include "mozilla/ScopeExit.h"
@ -83,6 +84,8 @@ bool ScriptBytecodeCompress(Vector<uint8_t>& aBytecodeBuf,
// TODO probably need to move this to a helper thread
AUTO_PROFILER_MARKER_TEXT("ScriptBytecodeCompress", JS, {}, ""_ns);
PerfStats::AutoMetricRecording<PerfStats::Metric::JSBC_Compression>
autoRecording;
ScriptBytecodeDataLayout uncompressedLayout(aBytecodeBuf, aBytecodeOffset);
ScriptBytecodeCompressedDataLayout compressedLayout(
@ -129,6 +132,8 @@ bool ScriptBytecodeDecompress(Vector<uint8_t>& aCompressedBytecodeBuf,
size_t aBytecodeOffset,
Vector<uint8_t>& aBytecodeBufOut) {
AUTO_PROFILER_MARKER_TEXT("ScriptBytecodeDecompress", JS, {}, ""_ns);
PerfStats::AutoMetricRecording<PerfStats::Metric::JSBC_Decompression>
autoRecording;
ScriptBytecodeDataLayout uncompressedLayout(aBytecodeBufOut, aBytecodeOffset);
ScriptBytecodeCompressedDataLayout compressedLayout(

View file

@ -19,6 +19,7 @@
#include "mozilla/Encoding.h"
#include "mozilla/Logging.h"
#include "mozilla/NotNull.h"
#include "mozilla/PerfStats.h"
#include "mozilla/ScopeExit.h"
#include "mozilla/StaticPrefs_dom.h"
#include "mozilla/Utf8.h"
@ -121,6 +122,7 @@ ScriptLoadHandler::OnIncrementalData(nsIIncrementalStreamLoader* aLoader,
nsCOMPtr<nsIRequest> channelRequest;
aLoader->GetRequest(getter_AddRefs(channelRequest));
auto firstTime = !mPreloadStartNotified;
if (!mPreloadStartNotified) {
mPreloadStartNotified = true;
mRequest->GetScriptLoadContext()->NotifyStart(channelRequest);
@ -138,6 +140,10 @@ ScriptLoadHandler::OnIncrementalData(nsIIncrementalStreamLoader* aLoader,
NS_ENSURE_SUCCESS(rv, rv);
}
if (mRequest->IsBytecode() && firstTime) {
PerfStats::RecordMeasurementStart(PerfStats::Metric::JSBC_IO_Read);
}
if (mRequest->IsTextSource()) {
if (!EnsureDecoder(aLoader, aData, aDataLength,
/* aEndOfStream = */ false)) {
@ -341,6 +347,7 @@ ScriptLoadHandler::OnStreamComplete(nsIIncrementalStreamLoader* aLoader,
nsCOMPtr<nsIRequest> channelRequest;
aLoader->GetRequest(getter_AddRefs(channelRequest));
auto firstMessage = !mPreloadStartNotified;
if (!mPreloadStartNotified) {
mPreloadStartNotified = true;
mRequest->GetScriptLoadContext()->NotifyStart(channelRequest);
@ -356,6 +363,12 @@ ScriptLoadHandler::OnStreamComplete(nsIIncrementalStreamLoader* aLoader,
NS_ENSURE_SUCCESS(rv, rv);
}
if (mRequest->IsBytecode() && !firstMessage) {
// if firstMessage, then entire stream is in aData, and PerfStats would
// measure 0 time
PerfStats::RecordMeasurementEnd(PerfStats::Metric::JSBC_IO_Read);
}
if (mRequest->IsTextSource()) {
DebugOnly<bool> encoderSet =
EnsureDecoder(aLoader, aData, aDataLength, /* aEndOfStream = */ true);

View file

@ -6,6 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/net/AltDataOutputStreamParent.h"
#include "mozilla/PerfStats.h"
#include "mozilla/Unused.h"
#include "nsIAsyncOutputStream.h"
@ -17,6 +18,7 @@ NS_IMPL_ISUPPORTS0(AltDataOutputStreamParent)
AltDataOutputStreamParent::AltDataOutputStreamParent(nsIOutputStream* aStream)
: mOutputStream(aStream), mStatus(NS_OK), mIPCOpen(true) {
MOZ_ASSERT(NS_IsMainThread(), "Main thread only");
PerfStats::RecordMeasurementStart(PerfStats::Metric::JSBC_IO_Write);
}
AltDataOutputStreamParent::~AltDataOutputStreamParent() {
@ -45,6 +47,8 @@ mozilla::ipc::IPCResult AltDataOutputStreamParent::RecvWriteData(
mozilla::ipc::IPCResult AltDataOutputStreamParent::RecvClose(
const nsresult& aStatus) {
PerfStats::RecordMeasurementEnd(PerfStats::Metric::JSBC_IO_Write);
if (NS_FAILED(mStatus)) {
if (mIPCOpen) {
Unused << SendError(mStatus);

View file

@ -29,7 +29,11 @@ static const char* const sMetricNames[] = {"DisplayListBuilding",
"Styling",
"HttpChannelCompletion",
"HttpChannelCompletion_Network",
"HttpChannelCompletion_Cache"};
"HttpChannelCompletion_Cache",
"JSBC_Compression",
"JSBC_Decompression",
"JSBC_IO_Read",
"JSBC_IO_Write"};
static_assert(sizeof(sMetricNames) / sizeof(sMetricNames[0]) ==
static_cast<uint64_t>(PerfStats::Metric::Max));

View file

@ -32,6 +32,10 @@ class PerfStats {
HttpChannelCompletion,
HttpChannelCompletion_Network,
HttpChannelCompletion_Cache,
JSBC_Compression,
JSBC_Decompression,
JSBC_IO_Read,
JSBC_IO_Write,
Max
};