производительность JavaScript между тонким клиентом и ПК - PullRequest
3 голосов
/ 03 августа 2010

У меня есть веб-приложение, использующее тонких клиентов (терминалы bosanova) в качестве внешнего интерфейса для пользователей. Я заметил некоторые различия в производительности в JavaScript между тонким клиентом и ПК. Терминалы работают под управлением Windows XP, встроенной в IE6, а на страницах, на которые я ссылаюсь, используется прототип JS Framework для довольно простой проверки элементов формы.

Например, вот что я использую, чтобы убедиться, что обязательные поля заполнены.
Есть еще два варианта для .numeric и .alaphanumeric, которые тестируют соответственно и выдвигают ошибки, чтобы остановить отправку формы.

$$( '.requiredfield' ).each( function ( elem ){
   if ( ( $( elem ).value.length == 0 ) || ( $( elem ).value == null ) ) {
        $( elem ).addClassName( "nonvalid" );
        $( elem ).siblings().first().addClassName( "error" );
        requiredErrors.push( $( elem ) );
   }

});

Проблема, с которой я сталкиваюсь, - это ПК в Firefox или IE, для формы с 5-20 полями на странице может потребоваться полсекунды для обработки дольше, чем без проверки. В Терминале, однако, выполнение проверки занимает от 15 до 25 секунд дольше, чем на той же странице без нее. Как я уже говорил, я проверял это в IE6 на ПК и не вижу потери производительности. Звонок Босановой привел меня к обновлению памяти в терминале, что я и сделал перед этой публикацией, и результаты не изменились.

Я могу изменить скрипт, так что я перебираю поля формы только один раз и обрабатываю .required .numeric .alphanumeric, и я уверен, что это поможет. Как сейчас, между ПК и терминалом (тонким клиентом) такая разница в производительности. Мне любопытно узнать почему.

Если у кого-то есть опыт устранения неполадок или он знает, почему прототип / javascript понесет такую ​​потерю производительности на терминале, я был бы очень признателен за некоторые советы.

Обновление: >>>>>>>>>>>>>>>>>

Я все еще тестировал и изучал эту проблему и думал, что поделюсь этим. Вчера мы получили более новый Терминал, который я загрузил и протестировал. Новый терминал с IE6 работал безупречно, как и любой другой браузер. Конечно, он был немного медленнее, чем ПК, потому что: 1. на нем запущен IE6, а 2. - тонкий клиент, но разница в скорости составляла сотни секунд, а разница в 10–50 секунд - при тех же сценариях. Физические характеристики двух разных тонких клиентов не такие уж и разные: 1,2 ГГц (старая) и 1,6 ГГц (новая) память были одинаковыми, а HD / DOM был 512 МБ (старый) против 1 ГБ (новый). До сих пор не удалось точно определить, что происходит в старом терминале, но похоже, что он связан с этой конкретной моделью / ревизией терминала.

Обновление: >>>>>>>>>>>>>>>>>

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

Что ж, движок Javascript в IE6 медленный - помните, что это было в то время, когда Microsoft настаивала на том, что любая настоящая разработка приложений для Интернета должна конечно выполняться с ActiveX.На тонком клиенте с дешевым, вероятно, не слишком быстрым процессором, он будет действительно медленным.

Вы можете немного ускорить этот код, изменив селектор:

$$( 'input.requiredfield' ).each( function ( elem ){
0 голосов
/ 03 августа 2010

Я не слишком много знаю о Prototype, но вы должны кэшировать этот элемент в локальной переменной, а не оборачивать вокруг него функцию $.

$$( '.requiredfield' ).each( function ( elem ){
   var el = $(elem)
   if ( (elem.value.length == 0 ) || elem.value == null ) ) { // is elem.value ever null?
        el.addClassName( "nonvalid" );
        el.siblings().first().addClassName( "error" );
        requiredErrors.push(el);
   }
});

Не думаю, что это исправит всеиз проблем с производительностью, но, возможно, это сбрит несколько секунд.Я бы предложил продолжить упомянутое вами изменение, чтобы оно проверяло все ошибки / классы в одном цикле, а не просматривало все элементы для каждого типа класса.

Может быть что-то вроде (опять же, я не знаю прототипну так что-то может быть отключено):

var errors = {};

var rules = { 
   ".required": function (elem) { return elem.value.length == 0; },
   ".alphanumeric": function (elem) { return /[a-zA-Z0-9]+/.test(elem.value);  }
};

$$( "input", "#your_form_id" ).each(function ( elem ) {
   var el = $(elem)
   var classes = (function () { 
      var cls = elem.className.split(' '), classMap = {};
      for (var k in cls) classMap[cls[k]] = true;
      return classMap;
   })(); // get the classes for this element

   for ( var rule in rules ) {
       error[rule] = [];
       if ( rule in classes && !rules[rule](elem) ) {
          el.addClassName("nonvalid");
          el.siblings().first().addClassName("error");
          errors[rule].push(el);
       }
   }

});

Ваши ошибки будут в errors .. для доступа к любым элементам, которые не соответствуют обязательному правилу, вы должны сделать errors["required"], который будет возвращать массив.

...