Created
December 11, 2015 08:51
-
-
Save zwang/82632b0fec7897997902 to your computer and use it in GitHub Desktop.
Test the performance of functions calls in JavaScriptCore in iOS 8+
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class JSCContextTests: XCTestCase { | |
var jscContext: JSContext! | |
override func setUp() { | |
jscContext = JSContext() | |
let log_Binder: @convention(block) String -> Void = { input in | |
print(input) | |
} | |
let copyArray_Binder: @convention(block) [NSNumber] -> Void = { data in | |
var dataAsArray = [GLubyte]() | |
for i in 0 ..< data.count { | |
let num = data[i] | |
dataAsArray.append(num.unsignedCharValue) | |
} | |
} | |
// Pre allocate space is much faster than append | |
let copyArrayPreAllocate_Binder: @convention(block) [NSNumber] -> Void = { data in | |
var dataAsArray = [GLubyte](count: data.count, repeatedValue: 0) | |
for i in 0 ..< data.count { | |
let num = data[i] | |
dataAsArray[i] = num.unsignedCharValue | |
} | |
} | |
let global = "global" | |
jscContext.evaluateScript("var \(global) = {};") | |
let jsObject = jscContext.objectForKeyedSubscript(global) | |
jsObject!.setObject(unsafeBitCast(log_Binder, AnyObject.self), forKeyedSubscript: "log") | |
jsObject!.setObject(unsafeBitCast(copyArray_Binder, AnyObject.self), forKeyedSubscript: "copyArray") | |
jsObject!.setObject(unsafeBitCast(copyArrayPreAllocate_Binder, AnyObject.self), forKeyedSubscript: "copyArrayPre") | |
jscContext.evaluateScript("function foo() { global.log('foo'); }") | |
jscContext.evaluateScript("function emptyMethod() { }") | |
jscContext.exceptionHandler = { (ctx: JSContext!, value: JSValue!) in | |
Logger.error("JS ERROR: \(value)") | |
} | |
var script = "function foo10000() {" + | |
" for(var i = 0; i<100000; i++) {" + | |
" global.log('foo');" + | |
" }" + | |
"}" | |
self.jscContext.evaluateScript(script) | |
var arrayScript = "var byteArray = new Uint8Array([0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1])" | |
self.jscContext.evaluateScript(arrayScript) | |
script = "function copyArray10000() {" + | |
" for(var i = 0; i<100000; i++) {" + | |
" global.copyArray(byteArray);" + | |
" }" + | |
"}" | |
self.jscContext.evaluateScript(script) | |
arrayScript = "var byteArrayPre2 = new Uint8Array([0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1])" | |
self.jscContext.evaluateScript(arrayScript) | |
script = "function copyArrayPre210000() {" + | |
" for(var i = 0; i<100000; i++) {" + | |
" copyArrayPre(byteArrayPre2);" + | |
" }" + | |
"}" | |
self.jscContext.evaluateScript(script) | |
arrayScript = "var byteArrayPre = new Uint8Array([0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1])" | |
self.jscContext.evaluateScript(arrayScript) | |
script = "function copyArrayPre10000() {" + | |
" for(var i = 0; i<100000; i++) {" + | |
" copyArrayPre(byteArrayPre);" + | |
" }" + | |
"}" | |
self.jscContext.evaluateScript(script) | |
} | |
override func tearDown() { | |
} | |
func testPerformanceEmpty() { | |
self.measureBlock() { | |
for _ in 1...100000 { | |
self.jscContext.evaluateScript("emptyMethod();") | |
} | |
} | |
} | |
func testPerformance() { | |
self.measureBlock() { | |
for _ in 1...100000 { | |
self.jscContext.evaluateScript("foo();") | |
} | |
} | |
} | |
func testPerformance2() { | |
self.measureBlock { () -> Void in | |
self.jscContext.evaluateScript("foo10000();") | |
} | |
} | |
func testCopyArrayPerformance() { | |
// Increase the size of array from 8 to 15 and the time increased by about 40% | |
// 8 elements array: 0.102 sec | |
// 16 elements array: 0.146 sec | |
self.measureBlock { () -> Void in | |
self.jscContext.evaluateScript("copyArray10000();") | |
} | |
} | |
func testCopyArrayPreAllocatePerformance2() { | |
// Increase the size of array from 8 to 15 and the time increased by about 40% | |
// 8 elements array: 0.102 sec | |
// 16 elements array: 0.146 sec | |
// 64 elements? | |
self.measureBlock { () -> Void in | |
self.jscContext.evaluateScript("copyArrayPre210000();") | |
} | |
} | |
func testCopyArrayPreAllocatePerformance() { | |
// Increase the size of array from 8 to 15 and the time increased by about 40% | |
// 8 elements array: 0.102 sec | |
// 16 elements array: 0.146 sec | |
self.measureBlock { () -> Void in | |
self.jscContext.evaluateScript("copyArrayPre10000();") | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment