Оптимизация во время выполнения статических языков: JIT для C++?

Вам понадобится проверка орфографии, если вы хотите, чтобы слова были написаны и проанализированы правильно. Вот проверка орфографии, используемая для импорта пространства имен re, с полной статьей здесь ...

import re
from collections import Counter

def words(text): return re.findall(r'\w+', text.lower())

WORDS = Counter(words(open('big.txt').read()))

def P(word, N=sum(WORDS.values())): 
    "Probability of `word`."
    return WORDS[word] / N

def correction(word): 
    "Most probable spelling correction for `word`."
    return max(candidates(word), key=P)

def candidates(word): 
    "Generate possible spelling corrections for `word`."
    return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])

def known(words): 
    "The subset of `words` that appear in the dictionary of WORDS."
    return set(w for w in words if w in WORDS)

def edits1(word):
    "All edits that are one edit away from `word`."
    letters    = 'abcdefghijklmnopqrstuvwxyz'
    splits     = [(word[:i], word[i:])    for i in range(len(word) + 1)]
    deletes    = [L + R[1:]               for L, R in splits if R]
    transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
    replaces   = [L + c + R[1:]           for L, R in splits if R for c in letters]
    inserts    = [L + c + R               for L, R in splits for c in letters]
    return set(deletes + transposes + replaces + inserts)

def edits2(word): 
    "All edits that are two edits away from `word`."
    return (e2 for e1 in edits1(word) for e2 in edits1(e1))`

Он не только исправляет разделенные слова, но также удаляет, транспонирует и вставляет неправильные слова, чтобы «исправить» их. Вы можете заменить файл «big.txt» документом, который вы используете в конструкторе Counter, и, надеюсь, все будет работать оттуда.

21
задан Lance Roberts 12 August 2009 в 18:29
поделиться

6 ответов

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

Возможно, вам будет интересно найти информацию о HP Dynamo , хотя эта система ориентирована на нативный двоичный код -> нативный двоичный перевод, хотя поскольку C ++ почти исключительно скомпилирован в нативный код, я полагаю, это именно то, что вы ищете.

Вы также можете взглянуть на LLVM ,

33
ответ дан 29 November 2019 в 06:29
поделиться

В последние годы я довольно много занимался такой оптимизацией. Это было для API рендеринга графики, который я реализовал. Так как API определил несколько тысяч различных режимов рисования, так как функция общего назначения была очень медленной.

В итоге я написал свой собственный маленький Jit-компилятор для языка, специфичного для предметной области (очень близкий к asm, но с некоторыми структурами управления высокого уровня и добавлены локальные переменные).

Улучшение производительности, которое я получил, было между 10 и 60 факторами (в зависимости от сложности скомпилированного кода), поэтому дополнительная работа окупилась очень долго.

На ПК я бы не стал писать свой собственный jit- компилятор, но для компиляции JIT используйте LIBJIT или LLVM. В моем случае это было невозможно из-за того, что я работал на неосновном встроенном процессоре, который не поддерживается LIBJIT / LLVM,

10
ответ дан 29 November 2019 в 06:29
поделиться

Я полагаю, LLVM пытается сделать что-то из этого. Он пытается оптимизировать все время жизни программы (время компиляции, время компоновки и время выполнения).

3
ответ дан 29 November 2019 в 06:29
поделиться

Microsoft Visual Studio называет это " Оптимизация по профилю "; Вы можете узнать больше об этом на MSDN . По сути, вы запускаете программу несколько раз с приложенным профилировщиком для записи его горячих точек и других характеристик производительности, а затем вы можете передать выходные данные профилировщика в компилятор для получения соответствующих оптимизаций.

5
ответ дан 29 November 2019 в 06:29
поделиться

Visual Studio имеет опцию для выполнения профилирования во время выполнения, которая затем может быть использована для оптимизации кода.

«Оптимизация профиля по профилю»

5
ответ дан 29 November 2019 в 06:29
поделиться

Reasonable question - but with a doubtful premise.

As in Nils' answer, sometimes "optimization" means "low-level optimization", which is a nice subject in its own right.

However, it is based on the concept of a "hot-spot", which has nowhere near the relevance it is commonly given.

Definition: a hot-spot is a small region of code where a process's program counter spends a large percentage of its time.

If there is a hot-spot, such as a tight inner loop occupying a lot of time, it is worth trying to optimize at the low level, if it is in code that you control (i.e. not in a third-party library).

Now suppose that inner loop contains a call to a function, any function. Now the program counter is not likely to be found there, because it is more likely to be in the function. So while the code may be wasteful, it is no longer a hot-spot.

There are many common ways to make software slow, of which hot-spots are one. However, in my experience, that is the only one of which most programmers are aware, and the only one to which low-level optimization applies.

See this.

2
ответ дан 29 November 2019 в 06:29
поделиться
Другие вопросы по тегам:

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