可用柯里化封装计时器高阶函数,解耦耗时统计与业务逻辑:基础版支持同步函数计时,增强版兼容异步函数并允许自定义日志方式,进阶版通过多层柯里化实现标签复用。

可以用柯里化封装一个计时器高阶函数,把耗时统计逻辑和目标函数解耦,既保持原函数调用方式不变,又自动记录执行时间。
核心思路:返回带计时能力的函数
柯里化本身不是为了计时,但可以利用它“逐步接收参数、最后执行”的特性,在最终调用时插入 console.time / console.timeEnd 或手动计算时间差。关键是在真正执行原函数前开始计时,执行后立即结束并输出。
基础实现(支持单次调用)
下面是一个简洁可靠的版本,支持任意参数个数:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function time(fn, label = fn.name || 'anonymous') {
return function curried(...args) {
const start = performance.now();
const result = fn.apply(this, args);
const end = performance.now();
console.log(`${label} executed in ${(end - start).toFixed(2)}ms`);
return result;
};
}
<p>// 使用示例
const add = (a, b) => a + b;
const timedAdd = time(add, 'add');
timedAdd(100, 200); // 输出:add executed in 0.02ms
增强版:支持异步函数 & 自定义日志方式
实际项目中常需处理 Promise,且日志可能要传给监控系统而非仅打印。可扩展为:
立即学习“Java免费学习笔记(深入)”;
function timeAsync(fn, label = fn.name || 'anonymous', logger = console.log) {
return async function curried(...args) {
const start = performance.now();
try {
const result = await fn.apply(this, args);
const end = performance.now();
logger(`${label} succeeded in ${(end - start).toFixed(2)}ms`);
return result;
} catch (err) {
const end = performance.now();
logger(`${label} failed after ${(end - start).toFixed(2)}ms`, err);
throw err;
}
};
}
<p>// 使用示例
const fetchUser = (id) => fetch(<code>/api/user/${id}</code>).then(r => r.json());
const timedFetch = timeAsync(fetchUser, 'fetchUser');
timedFetch(123);
进阶技巧:柯里化 + 缓存标签 + 多次复用
如果想让同一个函数在不同场景下用不同标签计时(比如“校验耗时”、“渲染耗时”),可再柯里化一层:
const timeWithLabel = (label) => (fn) => time(fn, label);
<p>// 按需生成带标签的计时器
const timeValidation = timeWithLabel('validate');
const timeRender = timeWithLabel('render');</p><p>const validateInput = (str) => str.length > 0;
const renderPage = () => document.body.innerHTML = 'done';</p><p>const validated = timeValidation(validateInput);
const rendered = timeRender(renderPage);</p><p>validated('hello'); // validate executed in 0.01ms
rendered(); // render executed in 0.15ms

















