Skip to content

Instantly share code, notes, and snippets.

@zwang
Created December 11, 2015 08:51
Show Gist options
  • Save zwang/82632b0fec7897997902 to your computer and use it in GitHub Desktop.
Save zwang/82632b0fec7897997902 to your computer and use it in GitHub Desktop.
Test the performance of functions calls in JavaScriptCore in iOS 8+
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