Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion test-app/app/src/main/assets/app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
"gcThrottleTime": 500,
"memoryCheckInterval": 10,
"freeMemoryRatio": 0.50,
"markingMode": "none",
"maxLogcatObjectSize": 1024,
"forceLog": false,
"suppressCallJSMethodExceptions": false,
Expand Down
64 changes: 64 additions & 0 deletions test-app/app/src/main/assets/app/tests/benchmarks/jniBenchmarks.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,41 @@ function measureCallback(name, cb, kind, iterations) {
return report(name, samples);
}


// Splits an object's lifecycle into allocation (objects kept alive), release through a
// V8 GC (wrapper finalization and the Java-side strong -> weak bookkeeping), and the
// Java GC that follows. Each phase is reported per object.
function measureLifecycle(name, count, create) {
if (FILTER && name.indexOf(FILTER) < 0) return null;
count *= SCALE;
var javaRuntime = java.lang.Runtime.getRuntime();
var alloc = [], release = [], javaGc = [];
var warm = [];
for (var w = 0; w < Math.max(1000, count >> 2); w++) warm.push(create());
warm = null;
gc();
javaRuntime.gc();
for (var r = 0; r < ROUNDS; r++) {
var kept = new Array(count);
var start = performance.now();
for (var i = 0; i < count; i++) kept[i] = create();
alloc.push((performance.now() - start) * 1e6 / count);

kept = null;
start = performance.now();
gc();
release.push((performance.now() - start) * 1e6 / count);

start = performance.now();
javaRuntime.gc();
javaGc.push((performance.now() - start) * 1e6 / count);
}
report(name + " [alloc, kept alive]", alloc);
report(name + " [release: V8 gc]", release);
return report(name + " [release: Java gc]", javaGc);
}


function buildBenchmarks() {
var bench = new JniBench();
var other = bench.getOther();
Expand Down Expand Up @@ -244,6 +279,35 @@ function buildBenchmarks() {
return s;
});
},
function () {
return measureLifecycle("lifecycle new java.lang.Object()", 20000, function () {
return new java.lang.Object();
});
},
function () {
return measureLifecycle("lifecycle new Object.extend({})()", 20000, function () {
return new Extended();
});
},
function () {
return measureLifecycle("lifecycle JniBench.newObjectInJava()", 20000, function () {
return JniBench.newObjectInJava();
});
},
function () {
if (FILTER && "instance.self() [50k live wrappers]".indexOf(FILTER) < 0) return null;
var live = new Array(50000);
for (var i = 0; i < live.length; i++) live[i] = new java.lang.Object();
// Pinned from a global: an optimized frame may drop a local after its last use.
globalThis.__jniBenchLive = live;
var result = measureJs("instance.self() [50k live wrappers]", 50000, function (n) {
var s;
for (var i = 0; i < n; i++) s = bench.self();
return s;
});
globalThis.__jniBenchLive = null;
return result;
},
function () {
return measureCallback("callback.noArgs()", callback, 0, 20000);
},
Expand Down
5 changes: 1 addition & 4 deletions test-app/app/src/main/assets/app/tests/testGC.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
// Run GC tests only in Full marking mode
let describeFunc = __markingMode == 0 ? describe : xdescribe;

describeFunc("Tests garbage collection", function () {
describe("Tests garbage collection", function () {
var myCustomEquality = function(first, second) {
return first == second;
};
Expand Down
1 change: 0 additions & 1 deletion test-app/runtime/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,6 @@ add_library(
src/main/cpp/ConcurrentQueue.cpp
src/main/cpp/Constants.cpp
src/main/cpp/CrashBreadcrumbs.cpp
src/main/cpp/DirectBuffer.cpp
src/main/cpp/ErrorEvents.cpp
src/main/cpp/EventLoop.cpp
src/main/cpp/Events.cpp
Expand Down
4 changes: 2 additions & 2 deletions test-app/runtime/src/main/cpp/CallbackHandlers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,8 @@ bool CallbackHandlers::RegisterInstance(Isolate *isolate, const Local<Object> &j
success = !localInstance.IsNull();

if (success) {
jclass instanceClass = env.FindClass(fullClassName);
objectManager->SetJavaClass(jsObject, instanceClass);
// ResolveClass returned the class cache's global ref for fullClassName.
objectManager->SetJavaClass(jsObject, generatedJavaClass);
} else {
DEBUG_WRITE_FORCE("RegisterInstance failed with null new instance class: %s",
fullClassName.c_str());
Expand Down
56 changes: 0 additions & 56 deletions test-app/runtime/src/main/cpp/DirectBuffer.cpp

This file was deleted.

30 changes: 0 additions & 30 deletions test-app/runtime/src/main/cpp/DirectBuffer.h

This file was deleted.

6 changes: 4 additions & 2 deletions test-app/runtime/src/main/cpp/JsArgConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,10 @@ JsArgConverter::JsArgConverter(const v8::FunctionCallbackInfo<Value> &args,
m_error(Error()) {
m_argsLen = args.Length();

JniSignatureParser parser(methodSignature);
m_ownedTokens = parser.Parse();
if (m_argsLen > 0) {
JniSignatureParser parser(methodSignature);
m_ownedTokens = parser.Parse();
}

for (int i = 0; i < m_argsLen; i++) {
m_isValid = ConvertArg(args[i], i);
Expand Down
18 changes: 6 additions & 12 deletions test-app/runtime/src/main/cpp/MethodCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
#include "NativeScriptException.h"
#include "Runtime.h"
#include "ObjectManager.h"
#include <sstream>

using namespace v8;

Expand Down Expand Up @@ -111,19 +110,14 @@ MethodCache::CacheMethodInfo MethodCache::ResolveConstructorSignature(const Args

// Encoded signature <className>.S/I.<methodName>.<argsCount>.<arg1class>.<...>
string MethodCache::EncodeSignature(const string& className, const string& methodName, const FunctionCallbackInfo<Value>& args, bool isStatic) {
string sig(className);
sig.append(".");
if (isStatic) {
sig.append("S.");
} else {
sig.append("I.");
}
int len = args.Length();
string sig;
sig.reserve(className.size() + methodName.size() + 8 + len * 12);
sig.append(className);
sig.append(isStatic ? ".S." : ".I.");
sig.append(methodName);
sig.append(".");
int len = args.Length();
stringstream s;
s << len;
sig.append(s.str());
sig.append(std::to_string(len));

for (int i = 0; i < len; i++) {
sig.append(".");
Expand Down
Loading
Loading