我有一些对时间敏感的异步代码,这些代码只能通过记录实时数据然后查看日志来进行调试。因此,我使用以下语句对代码进行了检测:
DBG(`Setting ${name} timer for ${amount} ms from runMore(${reason})`);
其中DBG()
具有这样的实现:
let debugOn = process.env["DEBUG_RATE_LIMIT_MAP"] === "1";
let DBG;
if (debugOn) {
DBG = function(...args) {
args.unshift(time() + ": ");
console.log(...args);
}
} else {
DBG = function() {};
}
通常的想法是,只有设置了环境变量,它才会输出到控制台。
这一切都很好,但是令我困扰的是,即使在未设置环境变量时它没有输出到控制台,它仍然会评估所有调试语句的参数,例如:
DBG(`Setting ${name} timer for ${amount} ms from runMore(${reason})`);
因此,它仍在为每个语句(评估模板字符串)进行废弃工作。显然,JavaScript不是像C ++这样的预处理语言,您可以在其中“编译”调试代码。您可以在Javascript中使用哪些技术将调试代码保留在代码库中(以备将来需要调试时使用),但是在不使用调试时又不会降低运行时性能?
有关任何其他代码参考,整个模块在这里:https://github.com/jfriend00/async-utils/blob/master/rateMap.js。
您是否一直需要DBG成为function
?如果没有,您可以执行以下操作:
let debugOn = process.env["DEBUG_RATE_LIMIT_MAP"] === "1";
let DBG;
if (debugOn) {
DBG = function(...args) {
args.unshift(time() + ": ");
console.log(...args);
}
}
然后在您的代码中,而不是直接调用DBG
,而是检查它是否是一个函数:
if (typeof DBG === "function") {
DBG(`Setting ${name} timer for ${amount} ms from runMore(${reason})`);
}
这样,您确实需要进行if
条件检查的开销,但要避免在生产环境中执行字符串文字。
根据一些评论,我目前的最佳想法是:
// environment variable that turns debug tracing on
let debugOn = process.env["DEBUG_RATE_MAP"] === "1";
function DBG(...args) {
if (debugOn) {
args.unshift(time() + ": ");
console.log(...args);
}
}
然后,在代码中执行此操作:
if (debugOn) DBG(`Setting ${name} timer for ${amount} ms from runMore(${reason})`);
而且,如果它只是一个纯字符串文字(所以就避免了模板求值),我可以这样做:
DBG('All done.');