Мне нужно профилировать приложение, которое выполняет много копий массивов, поэтому я профилировал эту очень простую функцию:
typedef unsigned char UChar;
void copy_mem(UChar *src, UChar *dst, unsigned int len) {
UChar *end = src + len;
while (src < end)
*dst++ = *src++;
}
Я использую Intel VTune, чтобы выполнить фактическое профилирование, и изтам я видел, что есть существенные различия при компиляции с gcc -O3 и "обычным" gcc (4.4).
Чтобы понять почему и как, я получил выходные данные сборки обеих компиляций.
Это неоптимизированная версия:
.L3:
movl 8(%ebp), %eax
movzbl (%eax), %edx
movl 12(%ebp), %eax
movb %dl, (%eax)
addl $1, 12(%ebp)
addl $1, 8(%ebp)
.L2:
movl 8(%ebp), %eax
cmpl -4(%ebp), %eax
jb .L3
leave
Итак, я вижу, что сначала она загружает меч из * src и помещает младший байт в edx, затем сохраняет его в * dst и обновляетуказатели: достаточно просто.
Затем я увидел оптимизированную версию и ничего не понял.
РЕДАКТИРОВАТЬ : здесь естьоптимизированная сборка.
Поэтому у меня такой вопрос: какие виды оптимизации gcc может выполнять в этой функции?