Сколько asm-инструкций на C-инструкцию?

Возможно, используйте XAML, чтобы связать свойство видимости с моделью представления текстового контекста. Я сделал это со всеми видами вещей.

11
задан Henrik Paul 1 December 2008 в 18:29
поделиться

7 ответов

Я не уверен, что Вы подразумеваете под "C-инструкцией", возможно, оператор или строка? Конечно, это будет варьироваться значительно из-за многих факторов, но после рассмотрения нескольких моих собственных примеров программ, многие из них близко к метке 2-1 (2 инструкции по сборке на LOC), я не знаю то, что это означает или как это могло бы быть полезно.

Можно изобразить это сами для какой-то конкретной программы и комбинации реализации путем просьбы, чтобы компилятор генерировал только блок (gcc -S например) или при помощи дизассемблера на уже скомпилированном исполняемом файле (но Вам был бы нужен исходный код для сравнения его с так или иначе).

Править

Только, чтобы подробно остановиться на этом на основе Вашего разъяснения того, что Вы пытаетесь выполнить (понимающий, сколько строк кода современный процессор может выполниться через секунду):

В то время как современный процессор может достигнуть 3 миллиардов циклов в секунду, который не означает, что может выполнить 3 миллиарда инструкций в секунду. Вот некоторые вещи рассмотреть:

  • Много инструкций берут несколько циклов для выполнения (подразделение, или операции с плавающей точкой могут взять десятки циклов для выполнения).
  • Большинство программ тратит подавляющее большинство своего времени, ожидая вещей как доступы памяти, доступы к диску, и т.д.
  • Многими другими факторами включая ОС наверху (планирование, системные вызовы, и т.д.) являются также ограничивающие факторы.

Но в целом да, процессоры невероятно быстры и могут выполнить удивительные вещи в короткий промежуток времени.

10
ответ дан 3 December 2019 в 01:13
поделиться

Никто не отвечает возможный. операторы как int a; мог бы потребовать нуля asm строки. в то время как операторы как a = call_is_inlined(); мог бы потребовать 20 + asm строки.

Вы видите себя путем компиляции c программы и затем запуска objdump -Sd ./a.out . Это отобразит asm и смешанный код C, таким образом, Вы будете видеть, сколько asm строк сгенерировано для одной строки C. Пример:

test.c

int get_int(int c);
int main(void) {
    int a = 1, b = 2;
    return getCode(a) + b;
}

$ gcc -c -g test.c

$ objdump -Sd ./test.o

00000000 <main>:
int get_int(int c);
int main(void) { /* here, the prologue creates the frame for main */
   0:   8d 4c 24 04             lea    0x4(%esp),%ecx
   4:   83 e4 f0                and    $0xfffffff0,%esp
   7:   ff 71 fc                pushl  -0x4(%ecx)
   a:   55                      push   %ebp
   b:   89 e5                   mov    %esp,%ebp
   d:   51                      push   %ecx
   e:   83 ec 14                sub    $0x14,%esp
    int a = 1, b = 2; /* setting up space for locals */
  11:   c7 45 f4 01 00 00 00    movl   $0x1,-0xc(%ebp)
  18:   c7 45 f8 02 00 00 00    movl   $0x2,-0x8(%ebp)
    return getCode(a) + b;
  1f:   8b 45 f4                mov    -0xc(%ebp),%eax
  22:   89 04 24                mov    %eax,(%esp)
  25:   e8 fc ff ff ff          call   26 <main+0x26>
  2a:   03 45 f8                add    -0x8(%ebp),%eax
} /* the epilogue runs, returning to the previous frame */
  2d:   83 c4 14                add    $0x14,%esp
  30:   59                      pop    %ecx
  31:   5d                      pop    %ebp
  32:   8d 61 fc                lea    -0x4(%ecx),%esp
  35:   c3                      ret
22
ответ дан 3 December 2019 в 01:13
поделиться

Я не уверен, что существует действительно полезный ответ на это. Наверняка необходимо будет выбрать архитектуру (как Вы предположили).

Что я сделал бы: Возьмите разумную измеренную программу C. Дайте gcc "-S" опцию и проверьтесь. Это генерирует ассемблерный исходный код, и можно вычислить отношение для той программы сами.

1
ответ дан 3 December 2019 в 01:13
поделиться

Это варьируется чрезвычайно! Я woudn't верят любому, если они пытались предложить грубое преобразование.

Операторы как i++; может перевести в сингл INC AX.

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

Затем добавьте там компиляторную оптимизацию, которая соберет Ваш код способом, отличающимся, чем Вы записали этому таким образом устранение инструкций.

Также некоторые инструкции, выполненные лучше на границах машинного слова так NOPs будет наперчен всюду по Вашему коду.

4
ответ дан 3 December 2019 в 01:13
поделиться

Я не думаю, что можно завершить что-либо полезное безотносительно о производительности реальных приложений от того, что Вы пытаетесь сделать здесь. Если 'не точный' не означает 'в нескольких порядках величины'.

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

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

3
ответ дан 3 December 2019 в 01:13
поделиться

В зависимости от Вашей среды Вы могли использовать опцию Visual Studio: / ФАС

больше здесь

2
ответ дан 3 December 2019 в 01:13
поделиться

RISC или CISC? Что такое инструкция в C, так или иначе?

Который должен повторить вышеупомянутые точки, что Вы действительно понятия не имеете, пока Вы не становитесь очень конкретными относительно типа кода, Вы работаете с.

Вы могли бы попытаться рассмотреть академическую литературу относительно оптимизации блока и перекрестных помех интерференции аппаратных средств/программного обеспечения, которые произошли за прошлые 30-40 лет. Это - то, куда Вы собираетесь найти некоторые реальные данные о том, чем Вы интересуетесь. (Хотя я предупреждаю Вас, Вы могли бы волновать наблюдение C-> данные PDP вместо C-> данные IA-32).

1
ответ дан 3 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

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