Производительность clientWidth в IE8

Отложенный режим CA : чтобы успешно завершить процессы с повышенными правами, необходимо запустить с повышенными правами. Это означает настраиваемое действие отложенного режима в MSI. Какой инструмент вы используете?

blockquote>

Legalese : Вы проверили, является ли ProcessMonitor.exe распространяемым? Я не уверен, что это так. Я бы определенно уточнил это, чтобы избежать каких-либо юридических проблем. It is a free tool, but that does not necessarily mean you can deploy it with your own package (redistribute it) , хотя это может быть разрешено, поскольку это установленный, зрелый и авторитетный продукт.

Procmon.exe : действительно ли этот инструмент необходим для вашего продукта? Честно говоря, очень странно устанавливать его, потому что это инструмент для специалистов и, как правило, нежелательный для обычных пользователей? Если вам это нужно для тестирования, вы можете скомпилировать его в свои настройки отладки и удалить из настройки выпуска. Вы используете WiX? Попробуйте переменные компилятора / конструкции препроцессора (см. Конкретный код разметки внизу). Еще некоторые детали переменных WiX .

Закрыть приложения : в procmon.exe есть встроенная функция выключения, которая показана ниже, однако есть много других подходов, которые могут работать. Вот краткий список . И вот еще один подход WMI . Most tools should never be forcefully terminated, but this tool may be entirely read-only. I am not sure .

Завершить : Вы сможете прервать procmon.exe экземпляров, вызвав procmon.exe следующим образом: procmon.exe /Terminate. Тем не менее, кажется, что он завершает только один экземпляр за один раз .

Список параметров командной строки доступен при запуске Procmon.exe /?:

Procmon.exe

6
задан Element 29 April 2009 в 02:51
поделиться

5 ответов

Я не смог найти никакой документации, что это известная ошибка. Для повышения производительности, почему бы не кэшировать свойство clientWidth и периодически обновлять кеш? IE, если вы код был:

var someValue = someElement.clientWidth + somethingElse;

Измените это на:

// Note the following 3 lines use prototype
// To do this without prototype, create the function,
// create a closure out of it, and have the function
// repeatedly call itself using setTimeout() with a timeout of 1000
// milliseconds (or more/less depending on performance you need)
var updateCache = function() {
   this. clientWidthCache = $('someElement').clientWidth;
};
new PeriodicalExecuter(updateCache.bind(this),1);

var someValue = this.clientWidthCache + somethingElse
2
ответ дан 16 December 2019 в 21:46
поделиться

Ваша проблема может быть связана с чем-то другим (а не только с вызовом clientwidth): вы обновляете / изменяете размер что-нибудь в DOM при вызове этой функции?

Ваш браузер может быть занят перекомпоновкой в IE8, что снижает пропускную способность клиента?

0
ответ дан 16 December 2019 в 21:46
поделиться

IE 8 имеет возможность переключаться между версиями IE, а также есть режим совместимости. Вы пробовали переключиться в режим совместимости? Это имеет значение?

0
ответ дан 16 December 2019 в 21:46
поделиться

Я решил эту проблему, если вам все еще интересно. Решение довольно сложное. По сути, вам нужно прикрепить простой HTC к элементу и кэшировать его clientWidth / Height.

Простой HTC выглядит так:

<component lightweight="true">
<script>
window.clientWidth2[uniqueID]=clientWidth;
window.clientHeight2[uniqueID]=clientHeight;
</script>
</component>

Вам нужно прикрепить HTC с помощью CSS:

.my-table td {behavior: url(simple.htc);}

Помните, что вам нужно только прикрепите поведение для IE8!

Затем вы используете некоторый JavaScript для создания геттеров для кэшированных значений:

var WIDTH = "clientWidth",
    HEIGHT = "clientHeight";

if (8 == document.documentMode) {

  window.clientWidth2 = {};
  Object.defineProperty(Element.prototype, "clientWidth2", {
    get: function() {
      return window.clientWidth2[this.uniqueID] || this.clientWidth;
    }
  });

  window.clientHeight2 = {};
  Object.defineProperty(Element.prototype, "clientHeight2", {
    get: function() {
      return window.clientHeight2[this.uniqueID] || this.clientHeight;
    }
  });

  WIDTH = "clientWidth2";
  HEIGHT = "clientHeight2";
}

Обратите внимание, что я создал константы WIDTH / HEIGHT. Вы должны использовать их, чтобы получить ширину / высоту ваших элементов:

var width = element[WIDTH];

Это сложно, но работает. У меня была та же проблема, что и у вас, доступ к clientWidth был невероятно медленным. Это очень хорошо решает проблему. Это все еще не такой быстрый IE7, но его снова можно использовать.

6
ответ дан 16 December 2019 в 21:46
поделиться

Хотя я заметил медленную производительность также при чтении свойств ширины. И вполне может быть.

Однако я обнаружил, что основное влияние на производительность в нашем приложении было то, что функция, которая была прикреплена к событию изменения размера окна, сама каким-то образом вызывала другое изменение размера, которое вызывало каскадный эффект, хотя и не бесконечный цикл. Я понял это, когда увидел, что количество вызовов функции в IE8 на несколько порядков больше, чем в IE7 (мне нравится IE Developer Tool). Я думаю, причина в том, что некоторые действия с элементами, например, установка ширины элементов, теперь вызывают перекомпоновку в IE8, чего не было в IE7.

Я исправил это, установив для события изменения размера окна значение: resize = "return myfunction (); " вместо того, чтобы просто изменить размер = "myfunction ();"

0
ответ дан 16 December 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: