Сколько операций в секунду выполняет c
Перейти к содержимому

Сколько операций в секунду выполняет c

  • автор:

Сколько операций в секунду выполняет c

Всем привет ! передо мной стоит задача — вычислить сколько операций
( +, -, *, /) произойдет за секунду для каждого типа.

я начал делать и кажется не правильно (покажу на примере int’ов, операции +)

В этом фрагменте я выполняю 1.000.000 операций, где mas1 и mas2 — массивы из 1000 элементов, потом в переменную time я :
получаю примерно 20 милисекунд. Делю 1000 (милисекунд в секунде) на результат и умножаю на 1.000.000 (кол-во операций), таким образом получая кол-во операций за секунду.

Прекрасно понимаю что мой алгоритм идиотский, по-этому хотел спросить как его улучшить или переделать)

CLOCKS_PER_SEC — это что за константа?
если тиков в сек., то

long double time =
1000000 / (((long double) (clock() — start1))/CLOCKS_PER_SEC) ;

иначе, если без констант:

long double time =
1000000 /(((long double) (clock() — start1))/1000) ;

Работа со временем и памятью

На олимпиадах, перед тем, как начинать писать решение, вам всегда надо сперва ответить себе на вопрос: А зайдёт ли моя программа по памяти и по времени?

У каждой задачи есть свои ограничения, стандартное: 1 секунда, 256Mb памяти. Научимся работать с этим.

Когда вы решаете задачу, удобно полагать, что вы можете делать $2 \cdot 10^8$ простых операций в секунду, если вы пишите на C++. Однако, эта величина зависит от сервера, на котором работает тестирующая система, и поэтому правильнее сделать следующее(желательно, на пробном туре, дабы не тратить попытки): заслать в систему программу, которая делает $10^8$ операций и заведомо укладывается в ограничения по времени и посмотреть, сколько времени она будет работать.

Итак, вы знаете, какое максимальное число операций ваше решение может себе позволить. Как же теперь оценить, сколько операций выполняет ваше решение? Тут нам на помощь приходит асимптотика. Зная асимптотику вашего решения, вы можете прикинуть с точностью до константы, сколько действий совершает ваша программа. Например, решение за $O(n^2)$ при $n$ до $10^4$ $

-$ это ОК, при условии, что вы не повторяете ваше решение $100$ раз. А вот решение, которое выполняет около $n^3$ операций при $n$ до $10^3$ $

-$ это уже TL.

С памятью сложнее. Каждый тип потребляет свое количество байт. Основные типы перечислены ниже:

  1. bool — 1 байт (обратите внимание, что хоть bool и несёт в себе 1 бит информации, в силу некоторых особенностей архитектуры компьютера, на его хранение всё равно выделяется 1 байт памяти)
  2. char — 1 байт
  3. int — 4 байта
  4. long long — 8 байт
  5. double — 8 байт

Теперь давайте посмотрим на вашу программу. Допустим вы используете 3 переменные типа bool, 1 int и массив на 1000 long long. Тогда ваша программа использует — $1000 \cdot 8 + 3 + 4 = 8007$ байт, в 1 килобайте — 1024 байт, следовательно наша программа потребляет меньше 8 килобайт, в мегабайте также 1024 килобайт, следовательно наша программа потребляет гораздо меньше 1 мегабайта памяти и точно подходит под ограничения.

Следует также помнить, что если ваше решение использует рекурсию, то это приводит к дополнительным небольшим, но всё же затратам памяти, о чём важно помнить, если вы пишете чувствительное к ограничениям по памяти решение.

Сколько операций в секунду выполняет c

coderdhanraj → CF New Chrome Extension (Userscript): CF Get Problems
CodemastersIntl → До окончания регистрации на Codemasters Code Cup осталось 5 дней
hetanhnandre → How to improve ?
CodeChef_admin → Invitation to September 2023 Short (Unrated for all) — 6th Sept
SashaT9 → SashaT9 Contest 1
peltorator → Round numbering system
vrooooom → USACO Bronze/Silver Classes Offered by CPI for Fall 2023!
Aliyyiakbar → Why Am I Struggling in Competitive Programming?
__fn__ → Tricks and help for improving
Na2Na2 → If you're reading this you have been IP logged
Eslam_Ahmed → Support My Team to participate in the ACPC Championship!
redblackblue → Need help with this problem from codeforces. Another Permutation Problem 1859C.
KyoumaHououin → Help Needed for CSES — Palindrome Queries
adamant → C++ STL: Policy based data structures
Parisa_Amiri → Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)
dweenHex → new comers problem
Medeali → Advice on efficient practice
yashsaha555 → Modulo
lis05 → CPv2 — how to make life easier
AkibAzmain → Feature Request: Allow blocking a blog from appearing in the "Recent Actions" section for me
simonlindholm → EGOI 2023 results and problems
shivansh1102 → CodeNite Sept 2023, organized by CodeClub, IIT Kharagpur
sevlll777 → Codeforces Round 895 (Div. 3)
Aris → Codeforces Round #797 (Div. 3) Разбор
awoo → Разбор Educational Codeforces Round 61

Блог пользователя pinkcorn

How many operations per second can my solution be?

Автор pinkcorn, 8 лет назад ,

I know the topcoder judging system and that it will allow a 10^9 solution to pass provided every operation is trivial. Will a 10^9 solution pass in codeforces? If not what can be the Big-O complexity of my solution so that it passes? Thanks!

Комментарии (17)

It depends on what type of operation you perform. If it is a simple for loop or something, it would be done in 2 seconds. But if you call a recursion function 10^9 times, even if it is a simple factorial function, it cannot be done in 2 seconds, I think.

Yup, with recursion there is the overhead of setting up a new stack for every function call, so a 10^9 solution is likely to fail. My question was mainly intended towards non-recursive solutions. Thanks for the answer!

If you do exactly 10^9 operations it may pass, but even a little more could not fit in 2 seconds. And also it depends on the language you are writing in. So if you are solving a problem here with any bound <= 10^9 you should not be able to get a solution that makes 10^9 operations, because as I said the chance to do <= 10^9 operations with that bound is very small. I cases like that you cant iterate and it is better start writing a log(N) solution, because it is bad to waste time.

You can test it yourself using "Custom Invocation"

← Rev. 7 → Проголосовать: нравится +26 Проголосовать: не нравится

This is a code to calculate one billion plus and mod operators between two integers. It spends 3260 ms to solve the correct answer 21 for (1+2+. +1000000000)%1000000007 If you don’t output the value of sum, the compiler seems to ignore the calculation of sum as well as the loop, and spends 0 ms. If you delete the mod operator, and change int into unsigned int (that means mod 4294967296)

It costs only 514 ms. That seems that mod(%) will cost 5 times more than plus(+). So it is so hard to say how many operators, because some operators like plus cost little time and some like mod cost much time.

The fact is that the module should be 4294967296 instead of 2147483648, because of unsigned int.

Оптимизация производительности в C++ приложениях (Windows)

Все думаю уже знают, но все же. Иногда нужно оценить, сколько процессорного времени занимает выполнение тех или иных функций программы(преимущественно я говорю сейчас о C++). Ну и ниже привожу свой способ, простой, но вполне меня устраивает.

Можно проинструментировать код различными специальными инструментами(не пробовал, вроде DevPartner один из них, думаю их немало сейчас).
Функции привязанные к времени не очень то хорошо работают, в WinAPI или в каком либо другом API я их не нашел.

Две функции которые мне весьма пришлись по вкусу:

QueryPerformanceFrequency
QueryPerformanceCounter

Вообще, тут можно заканчивать чтение статьи, чуть погуглить и хватит:)

С помощью этой парочки функций можно получить довольно точные оценки времени работы программных вычислений.

Собственно, QueryPerformanceFrequency возвращает количество элементарных операций которые может выполнить ваш процессор за одну секунду.
QueryPerformanceCounter возвращает количество элементарных операций, которое он уже выполнил с момента запуска компьютера.

«GetTickCount» — вроде как альтернатива, но ее точности мне как то не хватило, либо меня не устроило ее поведение, которое не слишком то внятно описано в MSDN, скорее ее можно использовать только для UI-расчетов.

Вычислить, сколько cекунд занимает вызов какой либо функции (метода класса) DoWork() с использованием QueryPerformanceFrequency/QueryPerformanceCounter собственно весьма просто:

Грешный код конечно, я лишь показал идею, может вдруг кому и пригодится.
Вообще, QueryPerformanceCounter, это «ReaD Time Stamp Counter(RDTSC)» инструкция ассемблера(вру о5, название инструкции #0f, #31, хотя постесняюсь сказать, на каких процессорах она работает, за что прошу меня простить:)

ЗЫ. При оценке производительности и простейших тестах, коими я иногда пользуюсь, стоит обратить внимание и на компилятор, большинство вменяемых компиляторов блок кода типа

преобразуют так, что вообще ее не нужно будет считать во время выполнения, и y=sin(PI/4) будет просчитан на стадии компиляии.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *