如何使我的代码更快

How do I make my code faster?

本文关键字:代码 我的 何使      更新时间:2023-09-26

以下代码非常适合完成我想在netsuite中实现的目标,但是我很难找到使其更快的方法。 我尝试不经常使用系统 nlapi,但如果不提交记录,我似乎无法使其工作。 任何指导将不胜感激。

function WonLost(type, name) {
    if (name == 'custbody138') {
        var recordid = nlapiGetRecordId();
        var record = nlapiLoadRecord('estimate', recordid);
        if ((nlapiGetFieldValue('custbody138')) == 'T') {
            var itemsall = "";
            var lineCount = parseInt(record.getLineItemCount('item'));
            var x = 1;
            while (x <= lineCount) {
                nlapiSelectLineItem('item', x);
                nlapiSetCurrentLineItemValue('item', 'custcol55', 'T', 'false');
                nlapiCommitLineItem('item');
                x++;
            }
        }
        else {
            var itemsall = "";
            var lineCount = parseInt(record.getLineItemCount('item'));
            var x = 1;
            while (x <= lineCount) {
                nlapiSelectLineItem('item', x);
                nlapiSetCurrentLineItemValue('item', 'custcol55', 'F', 'false');
                nlapiCommitLineItem('item');
                x++;
            }
        }
    }
}

这是什么类型的脚本?

看起来您正在加载部署脚本的记录。这是完全没有必要的,您可以只使用nlapi*函数而不是record.*函数。加载整个记录是您可以执行的开销较大的操作之一。

  • 删除recordidrecord变量
  • record.getLineItemCount呼叫替换为nlapiGetLineItemCount

另一种方法是在客户端脚本的 Recalc 函数上,并将'custcol55'设置为"T",这样就不需要迭代整个项目列表。

我在大学里睡过这个开销的概念,但我的基本理解是循环可能很昂贵。(性能密集型)

因此,如果有 100 行,

并且您一次循环 1 条,那就是 100 个循环,但如果每个循环可以处理 5 行,那么它只有 20 个循环。 这被称为"循环展开",http://en.wikipedia.org/wiki/Loop_unrolling

所以不要这样做...

while (x<= lineCount)
{
//do stuff on line x
x++;
}

相反,请尝试此...

while (x<= lineCount)
{
//do stuff on line x
//do stuff on line x+1
//do stuff on line x+2
//do stuff on line x+3
//do stuff on line x+4
x=x+5;
}
而且您还必须处理有 47

行的情况,因此您最多只能循环 ((int)(linecount/5)*5),然后在最后执行一次 1 个小型循环来处理 46 和 47(linecount%5)。

这导致了非常丑陋,不优雅的代码,但我已经看到它对性能非常有帮助,特别是在对长SQL查询进行分块时。 你必须玩弄块的大小,5可能太小或太大而没有好处,所以调整它并记录你的时间,直到你找到最佳点。