如何避免调试代码使Java的运行时性能降低成本

问题描述 投票:0回答:2

我有一些对时间敏感的异步代码,这些代码只能通过记录实时数据然后查看日志来进行调试。因此,我使用以下语句对代码进行了检测:

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

javascript debugging preprocessor
2个回答
1
投票

您是否一直需要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条件检查的开销,但要避免在生产环境中执行字符串文字。


0
投票

根据一些评论,我目前的最佳想法是:

// 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.');
© www.soinside.com 2019 - 2024. All rights reserved.