2015-03-12 3 views
0

Следующий код отлично подходит для достижения того, чего я хочу достичь в 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++; 
      } 
     } 
    } 
} 
+7

Это может быть лучше подходит для http://codereview.stackexchange.com/ – j08691

+6

Если вы хотите быстрее его прочитать, вам придется отступывать его. –

+4

@SpencerWieczorek [Голосовать, чтобы закрыть, потому что вопрос не в теме для переполнения стека, а не потому, что он принадлежит где-то еще] (http://meta.stackoverflow.com/a/286591/1310566). Голосование для закрытия, потому что оно принадлежит где-то в другом месте, может вызвать ситуации, когда вопрос закрывается на двух местах. Это нормально перенаправить людей на другие сайты, но не голосуйте, чтобы закрыть эту причину. Проголосуйте, чтобы закрыться как «слишком широкий» или «преимущественно основанный на мнениях». –

ответ

0

Какой тип скрипта это?

Похоже, вы загружаете запись, на которой установлен скрипт. Это совершенно не нужно, и вы можете просто использовать функции nlapi* вместо функций record.*. Загрузка целой записи - одна из самых дорогих операций, которую вы можете сделать.

  • Удалить ваши recordid и record переменных
  • Замените record.getLineItemCount звонки с nlapiGetLineItemCount
-3

Существует эта концепция накладных что я проспал в колледже, но мое основное понимание, что зацикливание может быть дорогим. (интенсивность работы)

Итак, если есть 100 строк, и вы прокручиваете их по одному за раз, это 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 может быть слишком маленьким или слишком большим, чтобы иметь преимущество, поэтому настройте его и запишите свое время, пока не найдете сладкое пятно.

+1

.... Думаю, вам стоит вернуться в колледж –

+0

ха-ха. Может быть, пока я вернусь в колледж, я встречу человека, который создал политику stackoverflow, которая требует от меня создания моей репутации, давая плохие ответы на вопросы, прежде чем мне позволю прокомментировать. – RightClick

0

Другим способом сделать это на Recalc Функции клиентского скрипта и установить 'custcol55' к «T», чтобы вы не нужно перебирать весь список элементов.

Смежные вопросы