Форум программистов, компьютерный форум CyberForum.ru

Методы оптимизации кода - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как сделать свою переменну в С++ http://www.cyberforum.ru/cpp-beginners/thread328357.html
Мне нужно подсчитывать очень большие числа, порядка 10^100000, и нужно создать свою переменную как можно это сделать?
C++ Работа в excel. срочно помогите срочно последнее задание по практике Идет k-я секунда суток (размещена в В10). Сколько полных часов h от 0 до 23 (в B11) полных минут m от 0 до 59 (в В12) и секунд s от 0 до 59 (в В13) прошло к этому времени. ---------------------------------------------------------------------------------------------------------- Для успешного решения задач необходимо ознакомиться с... http://www.cyberforum.ru/cpp-beginners/thread328355.html
C++ сервер с++
клиент - сервер работают если запушены на одном компе(127.0.0.1) у меня установлена виртуальная машина, попробовал на ней протестить - не соединяются. Virtualbox -> сетевой мост : реальная и виртуальные машины пингуют друг друга, в чем может быть проблема?! имя локальный адрес внешний адрес состояние TCP 0.0.0.0:135 0.0.0.0:0 LISTENING TCP 0.0.0.0:445 0.0.0.0:0 LISTENING ...
C++ Добавление и удаление элементов в середину списка
Доброго всем времени суток!! Есть прога добавления и удаления элементов в списке, из начала, конца. А вот с серединой что-то туговато.. Кто подскажет функцию добавления и удаления из середины списка? //обход списка #include<iostream> using namespace std; class Node { private: int data;
C++ Дан текст. файл, сост. из одной или нескольких строк.подскажите,как написать программу http://www.cyberforum.ru/cpp-beginners/thread328322.html
Дан текст. файл, сост. из одной или нескольких строк. Каждая строка файла содержит числа, разделенные пробелами. Из каждой строки файла удалить числа, предшествующие первому положительному чуслу. Если в строке нет положительных чисел, оставить её без изменения
C++ динамический 2-х мерный массив помогите плиз вот код , нужно составить динамический 2-х мерный массив double **a int n,m,l; scanf("%d%d",&n,&m); a=(double **) colloc (m,sizeof(double*)); for (i=0;i<m;i++) a=(double *) colloc(n,sizeof (double)) подробнее

Показать сообщение отдельно
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.07.2011, 21:08     Методы оптимизации кода
микроконтроллеры

Добавлено через 2 часа 44 минуты
Цитата Сообщение от FiloXSee Посмотреть сообщение
Да, видимо там не очень удачный комментарий. Видимо комментатор там имел в виду, что нужно выносить все сложные вычисления из части условия в раздел объявления переменных, чтобы вычислять верхний предел один раз.
Со strlen() пример действительно не совсем удачный.
Касательно же циклов здесь есть гораздо более важный момент: очень желательно, чтобы к моменту начала цикла было бы известно точное количество итераций (даже вычисленное в рантайме). Это даст компилятору шанс развернуть цикл и использовать векторизацию (SIMD).
Например из кода
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    unsigned len, i, sum = 0;
    char s[1024];
    scanf("%s",s);
    scanf("%u",&len);
    for (i = 0; s[i]; ++i) /* неизвестно сколько раз */
        sum += s[i];
    printf("%d\n", sum);
    return 0;
}
gcc -O3 на x86_64 делает такой ассемблерный (извините за AT&T ) между scanf и printf
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    call    scanf
    movzbl  16(%rsp), %eax
    testb   %al, %al
    je  .L5
    addq    $1, %rbx
    xorl    %edx, %edx
    .p2align 4,,10
    .p2align 3
.L3:
    movsbl  %al, %eax
    addl    %eax, %edx
    movzbl  (%rbx), %eax
    addq    $1, %rbx
    testb   %al, %al
    jne .L3
.L2:
    xorl    %eax, %eax
    movl    $.LC2, %esi
    movl    $1, %edi
    call    __printf_chk
; .................
 
.L5:
    .cfi_restore_state
    xorl    %edx, %edx
    jmp .L2
Тогда как из кода
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    unsigned len, i, sum = 0;
    char s[1024];
    scanf("%s",s);
    scanf("%u",&len);
    for (i = 0; i < len; ++i) /* ровно len раз */
        sum += s[i];
    printf("%d\n", sum);
    return 0;
}
получается это:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    call    scanf
    movl    28(%rsp), %esi
    testl   %esi, %esi
    je  .L8
    movl    %esi, %ecx
    shrl    $4, %ecx
    movl    %ecx, %eax
    sall    $4, %eax
    cmpl    $15, %esi
    jbe .L9
    testl   %eax, %eax
    je  .L9
    pxor    %xmm0, %xmm0
    xorl    %edx, %edx
    pxor    %xmm6, %xmm6
    pxor    %xmm4, %xmm4
    .p2align 4,,10
    .p2align 3
.L4:
    movdqa  (%rbx), %xmm1
    addl    $1, %edx
    movdqa  %xmm6, %xmm3
    addq    $16, %rbx
    movdqa  %xmm1, %xmm2
    cmpl    %edx, %ecx
    pcmpgtb %xmm1, %xmm3
    punpcklbw   %xmm3, %xmm2
    punpckhbw   %xmm3, %xmm1
    movdqa  %xmm4, %xmm3
    movdqa  %xmm2, %xmm5
    pcmpgtw %xmm2, %xmm3
    punpckhwd   %xmm3, %xmm2
    punpcklwd   %xmm3, %xmm5
    movdqa  %xmm1, %xmm3
    paddd   %xmm5, %xmm0
    paddd   %xmm2, %xmm0
    movdqa  %xmm4, %xmm2
    pcmpgtw %xmm1, %xmm2
    punpcklwd   %xmm2, %xmm3
    punpckhwd   %xmm2, %xmm1
    paddd   %xmm3, %xmm0
    paddd   %xmm1, %xmm0
    ja  .L4
    movdqa  %xmm0, %xmm1
    cmpl    %eax, %esi
    psrldq  $8, %xmm1
    paddd   %xmm1, %xmm0
    movdqa  %xmm0, %xmm1
    psrldq  $4, %xmm1
    paddd   %xmm1, %xmm0
    movd    %xmm0, 12(%rsp)
    movl    12(%rsp), %edx
    je  .L2
    .p2align 4,,10
    .p2align 3
.L10:
    mov %eax, %ecx
    addl    $1, %eax
    movsbl  32(%rsp,%rcx), %ecx
    addl    %ecx, %edx
    cmpl    %eax, %esi
    ja  .L10
.L2:
    xorl    %eax, %eax
    movl    $.LC2, %esi
    movl    $1, %edi
    call    __printf_chk
; .................
 
.L8:
    .cfi_restore_state
    xorl    %edx, %edx
    jmp .L2
.L9:
    xorl    %edx, %edx
    xorl    %eax, %eax
    .p2align 4,,2
    jmp .L10
что на длинных циклах реально должно получиться эффективнее (считаем что данные в кэше) за счёт активного использования SSE и нечастых проверок с переходами.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru