如何让我的代码更快?

时间:2015-03-12 19:28:06

标签: javascript netsuite

以下代码可以很好地完成我想在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++;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

这是什么类型的脚本?

看起来您正在加载部署脚本的记录。这完全没必要,您可以使用nlapi*函数代替record.*函数。加载整个记录是您可以执行的更昂贵的操作之一。

  • 删除recordidrecord变量
  • record.getLineItemCount来电替换为nlapiGetLineItemCount

答案 1 :(得分:0)

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

答案 2 :(得分:-3)

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

因此,如果有100行并且你一次循环1个,那就是100个循环,但是如果你每个循环可以处理5行,那么它只有20个循环。它被称为&#34;循环展开&#34;,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-a-time循环处理46和47(行数%5)。

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