HarmonyOS鸿蒙Next中如何测量JavaScript函数的精确执行时间(纳秒级)?

HarmonyOS鸿蒙Next中如何测量JavaScript函数的精确执行时间(纳秒级)? 我们需要 benchmark 两个算法的性能差异,但 Date.now() 精度只有毫秒。

4 回复

systemDateTime.getTime

getTime(isNanoseconds?: boolean): number

使用同步方式获取自Unix纪元以来到当前系统时间所经过的时间。

系统能力: SystemCapability.MiscServices.Time

参数:

参数名 类型 必填 说明
isNanoseconds boolean 返回结果是否为纳秒数。
- true:表示返回结果为纳秒数(ns)。
- false:表示返回结果为毫秒数(ms)。
默认值为false。

返回值:

类型 说明
number 自Unix纪元以来到当前系统时间所经过的时间。
import { BusinessError } from '@kit.BasicServicesKit';
try {
  let time: number = systemDateTime.getTime(true)
} catch(e) {
  let error = e as BusinessError;
  console.error(`Failed to get time. message: ${error.message}, code: ${error.code}`);
}

详见开发文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-date-time#systemdatetimegettime10

更多关于HarmonyOS鸿蒙Next中如何测量JavaScript函数的精确执行时间(纳秒级)?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


使用 timer.performanceNow()(高精度单调时钟):

import timer from '@ohos:timer';
const start = timer.performanceNow(); // 返回 double,单位毫秒,精度 ~1μs
myAlgorithm();
const duration = timer.performanceNow() - start;
console.log(`耗时: ${duration.toFixed(3)} ms`);

该时钟不受系统时间调整影响,适合微基准测试。

在HarmonyOS鸿蒙Next中,测量JavaScript函数纳秒级执行时间可使用performance.now()。该方法返回高精度时间戳,单位毫秒但精度可达微秒级。通过计算函数执行前后的时间差来获取执行时长。示例代码:

const start = performance.now();
// 执行待测函数
const end = performance.now();
const duration = end - start; // 单位为毫秒,可转换为纳秒

注意系统性能可能影响实际测量精度。

在HarmonyOS Next中,要测量JavaScript函数纳秒级的精确执行时间,推荐使用performance.now() API。它提供了高精度的时间戳,精度可达微秒级(百万分之一秒),足以满足大多数性能基准测试的需求。

核心方法:

const startTime = performance.now();
// 执行你的算法或函数
yourFunction();
const endTime = performance.now();
const executionTimeNs = (endTime - startTime) * 1_000_000; // 转换为纳秒
console.log(`执行时间: ${executionTimeNs} 纳秒`);

关键说明:

  1. performance.now() 返回的是从页面加载开始经过的时间(或应用启动开始,具体取决于上下文),而不是系统时间。
  2. 返回值以毫秒为单位,但带有小数部分,实际精度通常为微秒级(如 0.001 毫秒,即 1 微秒)。
  3. 通过乘以 1,000,000 可将结果转换为纳秒,但请注意实际测量精度受系统限制,可能无法达到真正的纳秒级分辨率。

注意事项:

  • 避免在单次执行中测量,应多次运行取平均值以减少误差。
  • 测量时确保没有其他高优先级任务干扰。
  • 对于极短函数的测量,建议使用循环多次执行后计算平均时间。

示例代码(多次测量取平均):

function measurePerformance(fn, iterations = 1000) {
    const start = performance.now();
    for (let i = 0; i < iterations; i++) {
        fn();
    }
    const totalTimeNs = (performance.now() - start) * 1_000_000;
    return totalTimeNs / iterations;
}

这种方法在HarmonyOS Next的ArkTS/JavaScript环境中是标准的高精度性能测量方案。

回到顶部