ANS-0653 · DéVELOPPEMENT SUITESCRIPT

Scripts NetSuite : quelle fonction est la plus rapide, nlapiLookupField ou nlapiLoadRecord ?

Un test de performances révèle des différences significatives en termes de temps d'exécution entre la récupération de valeurs de champs spécifiques via une recherche directe et le chargement d'un enregistrement complet.

Solution courte

Pour récupérer un nombre limité de valeurs de champs dans NetSuite SuiteScript, les fonctions de recherche directe sont nettement plus efficaces que le chargement de l'enregistrement complet. Des tests de performances indiquent que la fonction nlapiLookupField (ou N/search.lookupFields dans SuiteScript 2.x) est environ 50 fois plus rapide que la fonction nlapiLoadRecord (ou N/record.load) suivie d’une récupération des champs. Cette optimisation est cruciale pour les performances des scripts.

Scénario

Les développeurs ont souvent besoin de récupérer des valeurs de champs spécifiques à partir d’enregistrements NetSuite au sein de SuiteScript. Une question revient fréquemment concernant la méthode la plus efficace pour cette tâche : consulter directement la valeur du champ ou charger l’enregistrement complet, puis extraire le champ. Il est essentiel de comprendre les implications de ces deux approches en termes de performances afin d’optimiser le temps d’exécution des scripts.

Solution

Des tests de performances réalisés sur des enregistrements NetSuite démontrent que la récupération d’une ou de quelques valeurs de champ à l’aide d’une fonction de recherche directe est nettement plus rapide que le chargement de l’enregistrement complet suivi de l’accès au champ souhaité. Plus précisément, il a été constaté que la fonction nlapiLookupField était environ 50 fois plus rapide que la combinaison des fonctions nlapiLoadRecord() et getFieldValue(). Bien que le test ait été réalisé à l’aide des fonctions SuiteScript 1.0, le principe de performance sous-jacent reste valable pour leurs équivalents dans SuiteScript 2.x, à savoir respectivement N/search.lookupFields et N/record.load. NetSuite recommande vivement d’utiliser SuiteScript 2.x pour tous les scripts nouveaux ou ayant fait l’objet d’une révision en profondeur. Le test consistait à extraire 100 enregistrements de clients et de commandes client à l’aide d’une recherche enregistrée dans le cadre d’un script planifié. Pour chaque enregistrement, le temps d’exécution de la fonction nlapiLookupField() a été mesuré dans une boucle, puis comparé au temps d’exécution de la fonction nlapiLoadRecord() suivie de getFieldValue(). Le code SuiteScript 1.0 suivant a été utilisé pour effectuer cette comparaison de performances :

javascriptfunction testForGoodman() {var filters  [];var columns  [];//Built filters for the searchfilters.push(new nlobjSearchFilter('isinactive', null, 'is', 'F'));//Built columns for the searchcolumns.push(new nlobjSearchColumn('entityid'));//Run the searchvar recordSearchCustomer  nlapiSearchRecord('customer', null, filters, columns);var filters  [];var columns  [];//Built filters for the searchfilters.push(new nlobjSearchFilter('entity', null, 'noneof', 'q'));//Built columns for the searchcolumns.push(new nlobjSearchColumn('entity'));//Run the searchvar recordSearchSales  nlapiSearchRecord('salesorder', null, filters, columns);//******************Customer****************var dateCustomerBefore  new Date();var timeBeforeCust  dateCustomerBefore.getTime();var customerDivider  100;for (var i  0; i < customerDivider; i++) {    nlapiLookupField('customer', recordSearchCustomer[i].getId(), 'entityid');}var dateCustomerAfter  new Date();var timeAfterCust  dateCustomerAfter.getTime();nlapiLogExecution('debug', 'Customer Time For nlapiLookupField',(timeAfterCust - timeBeforeCust));var dateCustomerBefore  new Date();var timeBeforeCust  dateCustomerBefore.getTime();for (var i  0; i < customerDivider; i++) {    var rec  nlapiLoadRecord('customer', recordSearchCustomer[i].getId());    rec.getFieldValue('entityid');}var dateCustomerAfter  new Date();var timeAfterCust  dateCustomerAfter.getTime();nlapiLogExecution('debug', 'Customer Time FornlapiLoadRecord+getField', (timeAfterCust - timeBeforeCust));//*******************sales***********var dateSalesBefore  new Date();var timeBeforeSales  dateSalesBefore.getTime();var salesDivider  100;for (var i  0;  i < salesDivider; i++) {    nlapiLookupField('salesorder', recordSearchSales[i].getId(), 'entity');}var dateSalesAfter  new Date();var timeAfterSales  dateSalesAfter.getTime();nlapiLogExecution('debug', 'Sales Time For nlapiLookupField',(timeAfterSales - timeBeforeSales));var dateSalesBefore  new Date();var timeBeforeSales  dateSalesBefore.getTime();for (var i  0;  i < salesDivider; i++) {    var rec  nlapiLoadRecord('salesorder', recordSearchSales[i].getId());    rec.getFieldValue('entity');}var dateSalesAfter  new Date();var timeAfterSales  dateSalesAfter.getTime();nlapiLogExecution('debug', 'Sales Time For nlapiLoadrecord+getField',(timeAfterSales - timeBeforeSales));}

Support expert NetSuite

Besoin d’aide pour cet enjeu NetSuite ?

Accompagnement-conseil et configuration pour Développement SuiteScript

Parler à un consultant