Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
1

Почему код, написанный на С++, в разы быстрее работает с большим объемом памяти, чем с маленьким?

07.02.2012, 12:20. Просмотров 2045. Ответов 15
Метки нет (Все метки)

Привет!
Понадобилось мне сравнить скорость работы идентичных алгоритмов на Fortran и C++. Алгоритм - перемножение матриц. Решил поэкспериментировать с матрицами разных размеров.
Вот результаты
________________________C++____________Fortran
Матрицы100*100 (~80 КБ)
10000 перемножений______10,96 сек________10,97 сек
Матрицы 365*365 (~1МБ)
200 перемножений_________10,26 сек_______12,56 сек
Матрицы 1150*1150 (~10МБ)
1 перемножение____________2,4 сек________14,8 сек
По моему на 10 МБ С++ показывает просто поразительный результат. Как вы думаете, с чем это может быть связанно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2012, 12:20
Ответы с готовыми решениями:

Почему sudo zip -o Создает архив размером в разы большим, чем вес архивируемых в текущей папке файлов и папок?
Добрый день, Заметил такую штуку: В текущей папке файлов и папок на 270 mb Делаю: sudo...

Обычный код чтения файла на VB6 работает намного быстрее, чем на VB2005 ! ПОЧЕМУ ?
Переделал прогу с VB6 на VB2005. Она стала работать намного медленнее. Нашел фрагмент кода -...

Аналог InStr, но который работал бы быстрее с большим объемом данных
Есть ли аналог InStr, но который работал бы быстрее с большим объемом данных? P.S. надо в цикле...

Какую лучше выбрать видеокарту - с большим объёмом памяти или большими частотами памяти?
Какую лучше выбрать видеокарту - с большим объёмом памяти или большими частотами памяти?! Всё...

15
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
07.02.2012, 12:27 2
Цитата Сообщение от Kastaneda Посмотреть сообщение
Как вы думаете, с чем это может быть связанно?
Либо с тем, что ты не умеешь писать на фортране, либо с используемыми компиляторами.
0
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
07.02.2012, 13:08  [ТС] 3
Цитата Сообщение от NoMasters Посмотреть сообщение
Либо с тем, что ты не умеешь писать на фортране, либо с используемыми компиляторами.
На фортране я писать не умею, но дело не в этом. Алгоритм я переложил один в один:
Fortran
1
2
3
4
5
6
7
8
9
10
    do n=0, count
        do k=1,size
            do i=1,size
                do j=1,size
                    c(k,i)=c(k,i) + a(k,j) * b(j,i) ! a и b исходные матрицы, с - результирующая
                enddo
            enddo
        enddo
        !c = 0
    enddo
C++
1
2
3
4
5
6
7
8
9
   while(count--) {
        for(size_t i = 0; i < size; i++) {
            for(size_t j = 0; j < size; j++) {
                for(size_t n = 0; n < size; n++) {
                    C[i][j] += A[i][n] * B[j][n];
                }
            }
        }
    }
Интересно другое, на С++ разительно отличаются показатели в зависимости от размера матриц и от кол-ва перемножений.

P.S. компилятор g++, хотя по моему это не важно
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
07.02.2012, 13:32 4
1. Воспроизводится ли результат теста на другой машине (другого разработчика, etc.)?
2. Воспроизводится ли при сборке другим компилятором?

3. Перепроверь еще раз код теста. Он точно корректный? Нет UB или чего-нибудь подобного? Нет многопоточных блокировок или чего-нибудь подобного? Короче, можно ли безоговорочно доверять тесту?

Disclaimer:
Все эти вопросы - не для того, чтобы уличить тебя в каких-то ошибках или т.п., а - чтобы понять, в каком же направлении двигаться и искать разгадку.....
0
121 / 77 / 1
Регистрация: 08.06.2011
Сообщений: 267
07.02.2012, 13:35 5
g++ по умолчанию вроде оптимизирует ;/
0
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
07.02.2012, 14:25  [ТС] 6
Цитата Сообщение от CheshireCat Посмотреть сообщение
1. Воспроизводится ли результат теста на другой машине (другого разработчика, etc.)?
2. Воспроизводится ли при сборке другим компилятором?
Пока что нет возможности проверить

Цитата Сообщение от CheshireCat Посмотреть сообщение
3. Перепроверь еще раз код теста. Он точно корректный? Нет UB или чего-нибудь подобного? Нет многопоточных блокировок или чего-нибудь подобного? Короче, можно ли безоговорочно доверять тесту?
С кодом все в порядке. К тому же с другими размерами матриц результаты вменяемые, подозрителен только С++ тест с 10МБ.
0
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
07.02.2012, 16:22 7
Цитата Сообщение от Kastaneda Посмотреть сообщение
компилятор g++
То есть gfortran против g++? Попробуй руками задать одинаковые опции оптимизации.
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.02.2012, 18:35 8
Kastaneda, какие опции используешь при сборке?
приложи компилябельный код как для С++ так и для фортрана, плиз.
0
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
07.02.2012, 19:19  [ТС] 9
Цитата Сообщение от niXman Посмотреть сообщение
Kastaneda, какие опции используешь при сборке?
Честно говоря не особо задавлся этим вопросом. Тест был просто чтобы убедиться, что С++ быстрее, поэтому использовал дефолтные опции.
Код завтра выложу.

Добавлено через 37 секунд
Цитата Сообщение от NoMasters Посмотреть сообщение
То есть gfortran против g++
Да, именно так.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
07.02.2012, 19:21 10
Kastaneda, Ну g++ по дефолту компилит с -O2.
А вот gfortran - хз.
0
go
Эксперт С++
3639 / 1371 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
07.02.2012, 22:03 11
Kastaneda, странное время какое-то. Без вашего кода здесь никак.
да и алгоритм перемножения не понятный.
0
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
08.02.2012, 08:20  [ТС] 12
Цитата Сообщение от CheshireCat Посмотреть сообщение
3. Перепроверь еще раз код теста. Он точно корректный? Нет UB или чего-нибудь подобного? Нет многопоточных блокировок или чего-нибудь подобного? Короче, можно ли безоговорочно доверять тесту?
Все таки напортачил с индексами) Сегодня свежим взглядом посмотрел, переписал.
Теперь результат больше похож на правду - на 10Мб - С++ ~8,12 сек, Fortran - ~31,5 сек.
Т.е. с увиличением объема матрицы и при этом уменьшением перемножений С++ уменьшает время подсчета, а Фортран увеличивает. Думаю в С++ все дело в кол-ве переходов, а вот Фортран похоже качественно другой код генерит. Пока некогда в ассемблерном коде ковыряться.

Исходники (С++ под Linux):
C++
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <algorithm>
 
int main()
{
    const size_t size = 1150;
    size_t count = 1;
    double **A, **B, **C;
 
    A = new double*[size];
    B = new double*[size];
    C = new double*[size];
 
    std::generate_n(A, size, [=](){return new double[size];});
    std::generate_n(B, size, [=](){return new double[size];});
    std::generate_n(C, size, [=](){return new double[size];});
 
    srand(time(NULL));
 
    for(size_t i = 0; i < size; i++) {
        std::generate_n(A[i], size, rand);
        std::generate_n(B[i], size, rand);
        std::fill_n(C[i], size, 0);
    }
 
    std::cout << "Start calculation..." << std::endl;
    timespec time_start, time_end;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time_start);
 
    while(count--) {
        for (int k = 0; k < size; ++k) {
            for (int i = 0; i < size; ++i) {
                for (int j = 0; j < size; ++j) {
                    C[i][k] += A[i][j] * B[j][k];
                }
            }
        }
    }
 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time_end);
 
    int result_sec = time_end.tv_sec - time_start.tv_sec;
    int result_nsec;
    const int nanoseconds = 1E9;
 
    if(time_end.tv_nsec > time_start.tv_nsec) {
        result_nsec = time_end.tv_nsec - time_start.tv_nsec;
    } else {
        --result_sec;
        result_nsec = nanoseconds - time_start.tv_nsec + time_end.tv_nsec;
    }
 
    std::cout << "Time calculation: " << result_sec << "," <<  result_nsec << std::endl;
 
    std::for_each(A, A + size, [](double*& ptr){delete []ptr;});
    std::for_each(B, B + size, [](double*& ptr){delete []ptr;});
    std::for_each(C, C + size, [](double*& ptr){delete []ptr;});
 
    delete []A;
    delete []B;
    delete []C;
 
    return 0;
}
Fortran
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
program mulmatrix
    integer, parameter :: size = 1150, count = 1
    integer(4) i,j,k
    real(8), allocatable :: a(:,:),b(:,:),c(:,:)
 
    allocate(a(1:size, 1:size))
    allocate(b(1:size, 1:size))
    allocate(c(1:size, 1:size))
 
    call random_seed
    call random_number(a)
    call random_number(b)
    c = 0
 
    write(*,*) 'Start calculation...'
    time = second()
 
    do n=0, count
        do k=1,size
            do i=1,size
                do j=1,size
                    c(i,k)=c(i,j) + a(k,j) * b(j,k)
                enddo
            enddo
        enddo
    enddo
 
    time = second() - time
    write(*,*) 'Time calculation: ', time
 
    deallocate(a)
    deallocate(b)
    deallocate(c)
end program mulmatrix
0
go
Эксперт С++
3639 / 1371 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
08.02.2012, 20:46 13
Цитата Сообщение от Kastaneda Посмотреть сообщение
Теперь результат больше похож на правду - на 10Мб - С++ ~8,12 сек,
Лично у меня
Bash
1
2
3
4
‘‚@ANDREY-PC /c/mingw
$ kast.exe
Start calculation...
Time calculation: 32,729009800
0
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
09.02.2012, 07:11  [ТС] 14
Тут похоже дело в производительности компьютера. Думаю если с фортраном сравнить, то разница тоже хорошая будет.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
09.02.2012, 10:21 15
C++.
Стандартные опции.
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp -std=c++0x -lrt
forever@pterois:~/My_pro1/cpp_pro$ ./new 
Start calculation...
Time calculation: 20,472700106
O1.
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp -std=c++0x -lrt -O1
forever@pterois:~/My_pro1/cpp_pro$ ./new 
Start calculation...
Time calculation: 17,44365911
O2.
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp -std=c++0x -lrt -O2
forever@pterois:~/My_pro1/cpp_pro$ ./new 
Start calculation...
Time calculation: 16,436316937
O3.
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp -std=c++0x -lrt -O3
forever@pterois:~/My_pro1/cpp_pro$ ./new 
Start calculation...
Time calculation: 17,568185084
Fortran.
O0.
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ gfortran -o fort fort.f95 -O0
forever@pterois:~/My_pro1/cpp_pro$ ./fort 
 Start calculation...
 Time calculation:    88.117508
O1.
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ gfortran -o fort fort.f95 -O1
forever@pterois:~/My_pro1/cpp_pro$ ./fort 
 Start calculation...
 Time calculation:    74.132637
O2.
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ gfortran -o fort fort.f95 -O2
forever@pterois:~/My_pro1/cpp_pro$ ./fort 
 Start calculation...
 Time calculation:    73.540596
O3.
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ gfortran -o fort fort.f95 -O3
forever@pterois:~/My_pro1/cpp_pro$ ./fort 
 Start calculation...
 Time calculation:    73.912621
1
Kastaneda
09.02.2012, 11:53  [ТС]     Почему код, написанный на С++, в разы быстрее работает с большим объемом памяти, чем с маленьким?
  #16

Не по теме:

Фигасе у меня машина на работе мощная:)

0
09.02.2012, 11:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2012, 11:53
Привет! Вот еще темы с ответами:

Почему написанный одинаковый код по разному работает?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Почему программа на Lazarus работает быстрее, чем на C++Builder?
Здравствуйте! Вопрос выкладываю на два форума - C++Builder и Lazarus. Это, пожалуй, не вопрос, а...

Подскажите кто как работает с большим объемом данных, без БД
Всем привет! Суть такова, имеется набор файлов, которые проходят парсинг. В процессе парсинга...

Почему запрос в приложении выполняется в разы дольше чем в MicrosoftSQLServer
Добрый день! Впервые столкнулась с такой ситуацией: есть SQL запрос, который в MsSQLServer...

Почему раздел форума [C++ Builder] в разы крупнее, чем [Visual C++] ?
Заранее извиняюсь, это вопрос не провокационный. Просто интересно... Раздел 225 тыс. сообщений ...

Как работает время в программе, почему сортировка массива на 1000 элементов быстрее, чем сортировка массива на 8?
#include &lt;iostream&gt; #include &lt;chrono&gt; #include &lt;cmath&gt; #include &quot;List.h&quot; #include &lt;iomanip&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.