Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
1

Неверный вывод количества тактов

25.02.2017, 00:57. Показов 767. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
template<typename iterator>
std::pair<int, std::pair<iterator, iterator>> maxCrosssSubArray(iterator begin, iterator middle, iterator end)
{
    std::pair<int, std::pair<iterator, iterator>> left;
    left.first = 0;
    left.second.first = middle;
    left.second.second = middle;
    std::pair<int, std::pair<iterator, iterator>> right;
    right.first = 0;
    right.second.first = middle + 1;
    right.second.second = middle + 1;
    int left_sum = 0;
    int right_sum = 0;
    iterator i_left = middle;
    iterator i_right = middle + 1;
    while (i_left != begin - 1)
    {
        left_sum += *i_left;
        --i_left;
        if (left_sum > left.first)
        {
            left.first = left_sum;
            left.second.first = i_left;
        }
    }
    while (i_right != end)
    {
        right_sum += *i_right;
        ++i_right;
        if (right_sum > right.first)
        {
            right.first = right_sum;
            right.second.second = i_right;
        }
    }
    return std::make_pair(left.first + right.first, std::make_pair(left.second.first, right.second.second));
}
 
template<typename iterator>
std::pair<int, std::pair<iterator, iterator>> maxSubArray(iterator begin, iterator end)
{
    if (begin + 1 != end)
    {
        iterator middle = begin + (end - begin) / 2;
        auto left_sum = maxSubArray(begin, middle);
        auto right_sum = maxSubArray(middle, end);
        auto cross_sum = maxCrosssSubArray(begin, middle, end);
        auto max = std::max(cross_sum, std::max(left_sum, right_sum));
        return max;
    }
    else
    {
        return std::make_pair(*begin, std::make_pair(begin, end));
    }
}
 
template<typename iterator>
int _maxSubArray(iterator begin, iterator end)
{
    int max_sum = INT_MIN;
    for (iterator i = begin; i != end; ++i)
    {
        int temp_sum = 0;
        for (iterator j = i; j != end; ++j)
        {
            temp_sum += *j;
            if (temp_sum > max_sum)
            {
                max_sum = temp_sum;
            }
        }
    }
    return max_sum;
}
int main()
{
    std::vector<int> arr = { 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 };
    clock_t t1 = clock();
    std::cout << "max = " << maxSubArray(arr.begin(), arr.end()).first << std::endl;
    clock_t t2 = clock();
    std::cout << "clock = " << (t2 - t1) << std::endl << std::endl;
    t1 = clock();
    std::cout << "max = " << _maxSubArray(arr.begin(), arr.end()) << std::endl;
    t2 = clock();
    std::cout << "clock = " << (t2 - t1) << std::endl;
    return 0;
}
Почему-то каждый раз выводит разные значения в пределах от 0 до 2...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2017, 00:57
Ответы с готовыми решениями:

Замер количества тактов исполнения через rdtsc()
по идее rdtsc(); выдает кол-во тактов, т.е. т2-т1 выдаст затраченное кол-во тактов на том или ином...

Необходим подсчёт количества тактов в сети фейстеля
дан исходник http://file.qip.ru/file/Rc7F-xO9/jetcrypt.html нужно посчитать количество тактов в...

Неверный вывод
Доброго времени суток! Решал следующую задачу: Разработать ПО работы с битами. На основе...

Неверный вывод
Только начал разбираться со списками, подскажите в чем дело, я так пониманию что у меня с...

7
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
25.02.2017, 08:47 2
Они и не должны полностью совпадать. За разное время может выполняться.
0
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
25.02.2017, 14:34  [ТС] 3
nmcf, но почему так мало тратится тактов на выполнение алгоритма? Если за 1 такт можно выполнить несколько простых операций(арифметических или по работе с памятью), то тут разве не должно быть затрачено хотя бы 50 тактов?
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
25.02.2017, 17:13 4
Потому что процессоры стали быстрые, а clock() измеряет не такты процессора, а такты таймера, частота которого намного ниже.
1
187 / 54 / 19
Регистрация: 23.12.2016
Сообщений: 165
25.02.2017, 17:20 5
Обычно 1 clock - это 0.001 секунды. А что касается непосредственно подсчёта числа тактов процессора - я пробовал, мало применимо. Процессорное время делится между многими процессами, и когда дойдет очередь именно до вашего - одному диспетчеру задач известно. Плюс у этих процессов разные приоритеты. В общем моя программ подсчётов тактов выдавала очень разные величины, отличающиеся на не сколько порядков. Ну и процессоры сейчас изменяют свою частоту прямо во время выполнения программ, что не добавляет точности.
1
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
25.02.2017, 17:23 6
Есть спец. таймеры высокого разрешения, которые не зависят от снижения частоты.
0
187 / 54 / 19
Регистрация: 23.12.2016
Сообщений: 165
25.02.2017, 18:47 7
Цитата Сообщение от nmcf Посмотреть сообщение
Есть спец. таймеры высокого разрешения, которые не зависят от снижения частоты.
речь идет о QueryPerformanceCounter или есть другие более надежные и точные средства?
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
25.02.2017, 18:51 8
Цитата Сообщение от altmax Посмотреть сообщение
речь идет о QueryPerformanceCounter или есть другие более надежные и точные средства?
Да, если речь об обычных компьютерах.
0
25.02.2017, 18:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2017, 18:51
Помогаю со студенческими работами здесь

Неверный вывод в консоль
доброго времени суток не могу понять что не правильно..до этого писал на шарпе .там проблем с...

Неверный вывод в консоль
Здравствуйте. Начал изучать switch. Задача: Есть оценки &quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;, &quot;F&quot;....

Неверный вывод массива из файла
int main(); { setlocale (0, &quot;Russian&quot;); int *A=new int; ifstream fin;...

Неверный вывод в перегрузке оператора <<
При перегрузке функции выводит, как я поняла, адрес первого элемента из списка Помогите починить...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru