在TMS WEB Core中如何用Delphi调用performance.now()?
在TMS WEB Core Delphi中使用window.performance.now()计时
问题原因
TMS WEB Core生成的TJSPerformance类仅作为JS对象的类型标识,没有显式声明now方法,直接调用window.performance.now()会触发编译错误,但底层对应的JS原生对象是完整可用的,可通过以下两种方式调用该方法。
方法一:动态调用(快速实现)
利用Delphi对JS对象的动态访问特性,通过索引器调用now方法:
var t0, t1: Double; begin t0 := TJSWindow(window).performance['now'](); // 要计时的业务代码 for var i := 0 to 99999 do begin // 示例执行代码 end; t1 := TJSWindow(window).performance['now'](); console.log(Format('循环执行耗时: %.2f 毫秒', [t1 - t0])); end;
这种方式无需额外声明,直接借助JS对象的动态特性调用原生方法。
方法二:扩展TJSPerformance类(获得IDE代码补全)
如果希望IDE提供代码补全提示,可以在自定义单元中扩展TJSPerformance类,显式声明now方法:
unit MyWebExtensions; interface uses Web; type TJSPerformance = class(TJSObject) public function now: Double; overload; function now(originTime: Double): Double; overload; // 对应JS可选参数的重载 end; implementation function TJSPerformance.now: Double; begin Result := Self['now'](); end; function TJSPerformance.now(originTime: Double): Double; begin Result := Self['now'](originTime); end; end.
之后在需要使用的单元中引用MyWebExtensions,即可像JS中一样直接调用:
var t0, t1: Double; begin t0 := window.performance.now; // 计时业务代码 t1 := window.performance.now; console.log(Format('执行耗时: %.2f 毫秒', [t1 - t0])); end;
备选方案:使用TMS内置计时工具
如果不需要严格依赖performance.now()的高精度,也可以用Date.now()的Delphi版本实现计时:
var t0, t1: Int64; begin t0 := TJSDate.New.now; // 计时业务代码 t1 := TJSDate.New.now; console.log(Format('执行耗时: %.2f 毫秒', [(t1 - t0)])); end;
注意:performance.now()的计时精度比Date.now()更高,适合微秒级的精细计时场景。
内容的提问来源于stack exchange,提问作者Shaun Roselt
相关产品推荐
相关产品推荐

