Возможно управлять JIT-компилятором [дубликат]

Новые кодеры иногда пишут такой код:

my_calculator.button_0 = tkinter.Button(root, text=0)
my_calculator.button_1 = tkinter.Button(root, text=1)
my_calculator.button_2 = tkinter.Button(root, text=2)
...

Затем кодер остается с кучей именованных переменных с усилием кодирования O ( m * n ), где m - это число именованных переменных, а n - это количество раз, к которому необходимо получить доступ к группе переменных (включая создание) , Более проницательный новичок отмечает, что единственная разница в каждой из этих строк - это число, которое изменяется на основе правила и решает использовать цикл. Тем не менее, они зациклились на том, как динамически создавать эти имена переменных, и могут попробовать что-то вроде этого:

for i in range(10):
    my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)

Вскоре они обнаруживают, что это не сработает.

Если программа требует произвольных переменных «имена», лучше всего подходит словарь, как объясняется в других ответах. Однако, если вы просто пытаетесь создать много переменных, и вы не возражаете ссылаться на них с последовательностью целых чисел, вы, вероятно, ищете list. Это особенно верно, если ваши данные однородны, например, ежедневные показания температуры, еженедельные оценки викторины или сетка графических виджета.

Это можно собрать следующим образом:

my_calculator.buttons = []
for i in range(10):
    my_calculator.buttons.append(tkinter.Button(root, text=i))

Этот list также может быть создан в одной строке с пониманием:

my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]

Результат в любом случае - это заполненный list, с первым элементом, к которому обращаются с помощью my_calculator.buttons[0], следующего с my_calculator.buttons[1] и т. д. Имя переменной «base» становится именем list, и для доступа к нему используется различный идентификатор.

Наконец, не забудьте другие структуры данных, такие как set - это аналогично словарю, за исключением того, что каждое «имя» не имеет привязанного к нему значения. Если вам просто нужна «сумка» объектов, это может быть отличным выбором. Вместо этого:

keyword_1 = 'apple'
keyword_2 = 'banana'

if query == keyword_1 or query == keyword_2:
    print('Match.')

У вас будет следующее:

keywords = {'apple', 'banana'}
if query in keywords:
    print('Match.')

Используйте последовательность list для последовательности похожих объектов, a set для произвольного - помещенный пакет предметов или dict для мешка с именами со связанными значениями.

11
задан Trap 16 April 2009 в 00:07
поделиться

4 ответа

Вы можете заставить компилятор JIT скомпилировать весь набор сборок во время процедуры инициализации вашего приложения, используя метод PrepareMethod ... (без использования NGen).

Это решение более подробно описано здесь: Принуждение компиляции JIT во время выполнения .

16
ответ дан Liran 22 August 2018 в 12:23
поделиться

Если вы считаете, что на вас воздействует JIT, перекомпилируйте приложение NGEN и снова запустите тесты. В коде отсутствует JIT-код, который был скомпилирован NGEN. Если вы все еще видите всплески в приложении NGEN'd, то вы знаете, что они не вызваны JIT.

2
ответ дан dthorpe 22 August 2018 в 12:23
поделиться

Как отметил Марк, продолжающиеся шипы не звучат как проблемы JIT. Другие вещи, которые нужно искать:

  • Сбор мусора - вы выделяете память во время обработки звука? Если вы создаете много мусора или даже объектов, которые выходят из коллекции Gen 0, это может вызвать заметные всплески. Похоже, вы делаете какое-то предварительное выделение, но следите за скрытыми выделениями в библиотечном коде (даже цикл foreach может выделять!) [/ ​​G1]
  • Denormals. Существует проблема с некоторыми типами процессоров при работе с очень маленькими числами с плавающей запятой, которые могут вызвать всплески процессора. Подробнее см. В http://www.musicdsp.org/files/denormal.pdf .

Изменить:

Даже если вы Не хотите использовать NGen, по крайней мере сравните версию NGen'd, чтобы вы могли видеть, какая разница JITing делает

3
ответ дан Jim Arnold 22 August 2018 в 12:23
поделиться
  • 1
    Интересно. Я понятия не имел, что денормалы были таким чудовищным ударом. – Jeffrey Hantin 4 June 2009 в 05:45

Начальная скорость действительно звучит как Fusion + JIT, чему может помочь ILMerge (для Fusion) и NGEN (для JIT); вы всегда можете играть безмолвную дорожку через систему при запуске, чтобы это выполняло всю тяжелую работу без того, чтобы пользователь заметил какие-либо искажения?

NGEN - хороший вариант; есть ли причина , которую вы не можете использовать?

Проблемы, которые вы упоминаете после , не имеют такой же начальной нагрузки, как и JIT. Возможно, сбор мусора.

Вы пробовали профилирование? И CPU и память (коллекции)?

4
ответ дан Marc Gravell 22 August 2018 в 12:23
поделиться
  • 1
    Для меня единственной причиной, по которой не использовать ngen, было бы то, что она требует административных привилегий во время установки, поэтому не применима к установкам для каждого пользователя в корпоративных сетях. Может быть, это и причина ОП? – Dirk Vollmar 15 April 2009 в 12:36
  • 2
    Почему бы не сделать NGEN в качестве опции при установке? Поэтому, если у вас есть права администратора, сделайте это. В противном случае предупредите пользователя и не делайте этого. – Nic Wise 15 April 2009 в 15:23
Другие вопросы по тегам:

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