Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ шаблонные методы шаблона. Специализация. https://www.cyberforum.ru/ cpp/ thread442155.html
Вопрос: каким образом можно вынести реализацию методов класса за его пределы? Изначально вопрос формулировался так: Каким образом можно произвести специализацию одного из методов шаблона класса...
С++ Unit Test (модульное тестирование) C++
Вопроса по сути два. 1. что используете для модульного тестирования и почему отдаете этому предпочтение. 2. если используете eclipse, то очень интересует процесс конфигурирования eclipse для...
Сетевой график C++
ПОжалуйста помогите создать программу Задачи работы: - построение сетевого графика; - анализ сетевого графика; -оптимизация сетевого графика. p.s. сижу с сотки, интернет отключен программа...
C++ PopCap Games Framework 1.3 У кого есть ссылка на PopCap Games Framework 1.3 скиньте плииз! С сайта sourceforge.net никак не качается... Форум не место обмена ссылками! https://www.cyberforum.ru/ cpp/ thread440526.html
C++ Необычная Dll https://www.cyberforum.ru/ cpp/ thread439998.html
Есть ли способ написать DLL, в которой есть функция и через неё будут проходить вызовы экспортируемых функций? Например в DLL нет функции Func, и тогда, по-умолчанию вызывается функция Default?
Сборки MinGW(GCC-win32/win64) от niXman C++
с этого момента, буду производить тестовые/пререлизные/релизные сборки mingw. файлы с пометкой snapshot и prerelease - не стабильные версии. в реальных проектах использовать не рекомендую. использую...
Построение и программная реализация автоматных моделей языков C++
Доброе время суток всем. Будьте так любезны кто знает или умеет напишите пожалуйста примеры конечных автоматов. Можно в принципе и на Delphi толь тогда это не тот раздел. И всё же помагите...
C++ Кто может собрать оффсет из crossfire в dll всем привет. я с помощью программы ollydbg нашёл оФФсет игры crossfire ,я могу написать вам его,и чтобы вы его собрали в dll для читы плиз оч нужно https://www.cyberforum.ru/ cpp/ thread438749.html
C++ C++ и CS 1.6 https://www.cyberforum.ru/ cpp/ thread437780.html
Доброго времени суток! У меня возник вопрос, как средствами C++ узнать SteamID клиента CS 1.6 Хотя бы такой вариант! Запускаем созданную программу, затем игру cs 1.6 и в программе появляется...
C++ Модуль-посредник для wtsapi32.dll Здравствуйте. Вот пытаюсь написать модель-посредник для wtsapi32.dll. Судь заключается в том, что этот модуль заменяет оригинальный и просто перенаправляет все на оригинальный функции. При написании... https://www.cyberforum.ru/ cpp/ thread435341.html
Jesus loves me
Эксперт С++
5116 / 3128 / 353
Регистрация: 12.12.2009
Сообщений: 7,911
Записей в блоге: 2
08.02.2012, 08:20  [ТС] 0

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

08.02.2012, 08:20. Просмотров 2127. Ответов 15
Метки (Все метки)

Ответ

Цитата Сообщение от 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2012, 08:20
Готовые ответы и решения:

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

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

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

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

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