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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ шаблонные методы шаблона. Специализация. http://www.cyberforum.ru/cpp/thread442155.html
Вопрос: каким образом можно вынести реализацию методов класса за его пределы? Изначально вопрос формулировался так: Каким образом можно произвести специализацию одного из методов шаблона класса...
C++ С++ Unit Test (модульное тестирование) Вопроса по сути два. 1. что используете для модульного тестирования и почему отдаете этому предпочтение. 2. если используете eclipse, то очень интересует процесс конфигурирования eclipse для... http://www.cyberforum.ru/cpp/thread441995.html
Сетевой график C++
ПОжалуйста помогите создать программу Задачи работы: - построение сетевого графика; - анализ сетевого графика; -оптимизация сетевого графика. p.s. сижу с сотки, интернет отключен программа...
C++ PopCap Games Framework 1.3
У кого есть ссылка на PopCap Games Framework 1.3 скиньте плииз! С сайта sourceforge.net никак не качается... Форум не место обмена ссылками!
C++ Необычная Dll http://www.cyberforum.ru/cpp/thread439998.html
Есть ли способ написать DLL, в которой есть функция и через неё будут проходить вызовы экспортируемых функций? Например в DLL нет функции Func, и тогда, по-умолчанию вызывается функция Default?
C++ Сборки MinGW(GCC-win32/win64) от niXman с этого момента, буду производить тестовые/пререлизные/релизные сборки mingw. файлы с пометкой snapshot и prerelease - не стабильные версии. в реальных проектах использовать не рекомендую. использую... подробнее

Показать сообщение отдельно
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru