无头JSContexts中的高性能setImmediate

时间:2015-06-05 11:15:18

标签: javascript ios objective-c javascriptcore

我在JavaScript应用程序JSContext的帮助下,通过JavaScript在iOS应用程序中运行应用程序逻辑。最近,需要使用某种Promise库,不幸的是,WebKit原生的Promise实现在无头JSContext中不起作用。但是,所有Promise / A +库都需要一些机制来将回调分派给消息队列,而在浏览器中,具有最佳性能的选项现在是setImmediate

但是,无头setImmediate(例如JSContextpostMessage)中无法使用MessageChannel或浏览器中通常用于填充它的任何机制。

出于这个原因,我为setTimeoutsetImmediate注入了以下实现:

@implementation JSContext (TimingPolyfills)

- (void)injectTimerPolyfills {

    self[@"setTimeout"] = ^(JSValue *function, JSValue *timeout) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)([timeout toInt32] * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
            [function callWithArguments:@[]];
        });
    };

    self[@"setImmediate"] = ^(JSValue *function) {
        [function callWithArguments:@[]];
    };

}

@end

这似乎工作正常。但是,调度到本机和返回JS的性能影响是巨大的。以下微基准测试可能没有超级意义,但它显示了进行本地往返的成本:

// takes around 10.5s for 1.000.000 iterations
[context evaluateScript:@"setImmediate(function() {});"];
// takes around 6.5s for 1.000.000 iterations
[context evaluateScript:@"(function() {})();"];

所以最大的问题是:是否有任何选项可以获得setImmediate - 无头JSContext中的功能,其占用空间小于调度到本机并返回JS?

0 个答案:

没有答案