Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2

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

07.02.2012, 12:20. Показов 2891. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2012, 12:20
Ответы с готовыми решениями:

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

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

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

15
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
07.02.2012, 12:27
Цитата Сообщение от Kastaneda Посмотреть сообщение
Как вы думаете, с чем это может быть связанно?
Либо с тем, что ты не умеешь писать на фортране, либо с используемыми компиляторами.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
07.02.2012, 13:08  [ТС]
Цитата Сообщение от 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
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
07.02.2012, 13:32
1. Воспроизводится ли результат теста на другой машине (другого разработчика, etc.)?
2. Воспроизводится ли при сборке другим компилятором?

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

Disclaimer:
Все эти вопросы - не для того, чтобы уличить тебя в каких-то ошибках или т.п., а - чтобы понять, в каком же направлении двигаться и искать разгадку.....
0
 Аватар для Imate
121 / 77 / 1
Регистрация: 08.06.2011
Сообщений: 267
07.02.2012, 13:35
g++ по умолчанию вроде оптимизирует ;/
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
07.02.2012, 14:25  [ТС]
Цитата Сообщение от CheshireCat Посмотреть сообщение
1. Воспроизводится ли результат теста на другой машине (другого разработчика, etc.)?
2. Воспроизводится ли при сборке другим компилятором?
Пока что нет возможности проверить

Цитата Сообщение от CheshireCat Посмотреть сообщение
3. Перепроверь еще раз код теста. Он точно корректный? Нет UB или чего-нибудь подобного? Нет многопоточных блокировок или чего-нибудь подобного? Короче, можно ли безоговорочно доверять тесту?
С кодом все в порядке. К тому же с другими размерами матриц результаты вменяемые, подозрителен только С++ тест с 10МБ.
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
07.02.2012, 16:22
Цитата Сообщение от Kastaneda Посмотреть сообщение
компилятор g++
То есть gfortran против g++? Попробуй руками задать одинаковые опции оптимизации.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.02.2012, 18:35
Kastaneda, какие опции используешь при сборке?
приложи компилябельный код как для С++ так и для фортрана, плиз.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
07.02.2012, 19:19  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
Kastaneda, какие опции используешь при сборке?
Честно говоря не особо задавлся этим вопросом. Тест был просто чтобы убедиться, что С++ быстрее, поэтому использовал дефолтные опции.
Код завтра выложу.

Добавлено через 37 секунд
Цитата Сообщение от NoMasters Посмотреть сообщение
То есть gfortran против g++
Да, именно так.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.02.2012, 19:21
Kastaneda, Ну g++ по дефолту компилит с -O2.
А вот gfortran - хз.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
07.02.2012, 22:03
Kastaneda, странное время какое-то. Без вашего кода здесь никак.
да и алгоритм перемножения не понятный.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
08.02.2012, 08:20  [ТС]
Цитата Сообщение от 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
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
08.02.2012, 20:46
Цитата Сообщение от Kastaneda Посмотреть сообщение
Теперь результат больше похож на правду - на 10Мб - С++ ~8,12 сек,
Лично у меня
Bash
1
2
3
4
‘‚@ANDREY-PC /c/mingw
$ kast.exe
Start calculation...
Time calculation: 32,729009800
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.02.2012, 07:11  [ТС]
Тут похоже дело в производительности компьютера. Думаю если с фортраном сравнить, то разница тоже хорошая будет.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.02.2012, 10:21
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
09.02.2012, 11:53  [ТС]

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2012, 11:53
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru