Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/165: Рейтинг темы: голосов - 165, средняя оценка - 4.63
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81

Как с точностью до микросекунд замерить время выполнения функции?

16.11.2011, 12:33. Показов 33758. Ответов 89
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Товарищи, подскажите, как с точностью до микросекунд замерить время выполнения некоторой функции?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.11.2011, 12:33
Ответы с готовыми решениями:

Как получить время с точностью для микросекунд?
Здравствуйте, помогите чайнику. Сегодня первый день на C. Не могу получить точное время в микросекундах под виндой. С линуксом всё ясно: ...

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

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

89
 Аватар для COKPOWEHEU
4069 / 2703 / 433
Регистрация: 09.09.2017
Сообщений: 12,022
16.11.2017, 09:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от eNerGy3 Посмотреть сообщение
Выводится в мс, а нужно в микросек.
Ты серьезно?! Разумеется, оно выводится в миллисекундах! Микросекунды монитор и отобразить-то не успеет. А посмотреть код и разобраться как из него вытащить микросекунды, конечно же, ну никак невозможно.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
16.11.2017, 09:57
Цитата Сообщение от Pechkin80 Посмотреть сообщение
boost::chrono меряет в микросекундах, в отличие от std::chrono
откуда информация?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.11.2017, 12:34
Цитата Сообщение от GbaLog- Посмотреть сообщение
откуда информация?
из пальца, очевидно жеж
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
16.11.2017, 13:17
Точно замерить время до микросекунд невозможно, в условиях многозадачности ОС, прерываний, переключения контекстов и т.д, все равно, что мерить попугаями. Приблизительно можно замерить так , перед вызовом читаем текущий счетчик тактов ассемблерной вставкой rdtsc, аналогично после вызова, ну и далее по формуле (new_time - old_time)/QueryPerformanceFrequency. Эту величину умножаем на 1 млн. получаем то, что требуется. QueryPerformanceFrequency это частота процессора в Гц...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.11.2017, 13:53
Цитата Сообщение от smartpointer Посмотреть сообщение
QueryPerformanceFrequency
во-первых - баян.

во-вторых - его ещё нужно правильно готовить,
что бы не глючил.
там есть нюансы (например, юзают его принудительно только на одном ядре)

а в третьих, и это самое главное:
вот уже семь как этот способ морально устарел.

есть же: std::chrono::high_resolution_clock
под виндой, у себя под капотом его родимую и юзает.
вот только гарантированно - правильным способом.

и не нужно заморачиваться непортированной,
низкоуровневой,
платформоспецифичной
ботвой.
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
17.11.2017, 00:38
Цитата Сообщение от hoggy Посмотреть сообщение
во-вторых - его ещё нужно правильно готовить,
что бы не глючил.
Шта ?
Цитата Сообщение от hoggy Посмотреть сообщение
есть же: std::chrono::high_resolution_clock
под виндой, у себя под капотом его родимую и юзает.
вот только гарантированно - правильным способом.
Эээ... каким способом ?
Цитата Сообщение от hoggy Посмотреть сообщение
и не нужно заморачиваться непортированной,
низкоуровневой,
платформоспецифичной
ботвой.
Ну, ну... в отличие от вашего высокоуровнего мусора, можно гораздо быстрее и надежнее получить информацию.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2017, 02:13
Цитата Сообщение от smartpointer Посмотреть сообщение
Ну, ну... в отличие от вашего высокоуровнего мусора,
Ну да, ну да. "Нормальные пацаны" пишут на ассемблере, сами контролируют память и знают все подводные камни низкоуровневых API-ных вызовов на зубок...
Вы знаете насколько падает(а падает ли) производительность с использованием обёртки std::chrono? А учитывая, что "низкоуровневый" код будет писать не супер квалифицированный спец с многолетним стажем, его велосипеды скорее всего будут медленнее. Про кроссплатформу и безопасность я вообще молчу.
Сейчас программисты движутся в сторону от платформозависимых вещей и выбирают обёртки. chrono, thread, random, filesystem.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.11.2017, 11:49
Цитата Сообщение от smartpointer Посмотреть сообщение
Шта ?
какая именно буква не понятна?
Цитата Сообщение от hoggy Посмотреть сообщение
например, юзают его принудительно только на одном ядре
иначе, функция время от времени будет давать сильные отклонения
от среднестатистического.

Цитата Сообщение от smartpointer Посмотреть сообщение
Эээ... каким способом ?
а здесь какая именно буковка не понятна?
Цитата Сообщение от hoggy Посмотреть сообщение
гарантированно - правильным способом
Цитата Сообщение от smartpointer Посмотреть сообщение
в отличие от вашего высокоуровнего мусора, можно гораздо быстрее и надежнее получить информацию.
нет, не можно.
и вы никак не сможете это продемонстрировать на практике.


более того.
взять тот же QueryPerformanceFrequency
судя по вашей реакции,
сами вы без посторонней помощи какого нибудь стек-оверфлоу,
вообще не сможете его хотя бы просто правильно использовать
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
17.11.2017, 12:28
Цитата Сообщение от MrGluck Посмотреть сообщение
Вы знаете насколько падает(а падает ли) производительность с использованием обёртки std::chrono? А учитывая, что "низкоуровневый" код будет писать не супер квалифицированный спец с многолетним стажем, его велосипеды скорее всего будут медленнее. Про кроссплатформу и безопасность я вообще молчу.
Сейчас программисты движутся в сторону от платформозависимых вещей и выбирают обёртки. chrono, thread, random, filesystem.
В том то и дело, что "программисты" не могут написать что-то свое по причине лени\неумения\незнания. И как вы можете утверждать, если своих велосипедов не писали ? Вы уверены, что любая функция из STL заработает одинаково правильно для MAC\Unix\Windows и заработает ли ? Про безопасность я вообще молчу, она уже достигается по дефолту большинством функций низкоуровневых реализаций WinApi.
Цитата Сообщение от hoggy Посмотреть сообщение
вообще не сможете его хотя бы просто правильно использовать
Вы вкладываете какой-то глубокий сакральный смысл в свои предложения. Стандартный вызов WinApi функции нужно вызывать правильно - так и запишем
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.11.2017, 12:41
Цитата Сообщение от smartpointer Посмотреть сообщение
Вы вкладываете какой-то глубокий сакральный смысл в свои предложения.
верно.
ваше поведение красноречиво дает понять,
что вы просто не в курсе подводных граблей QueryPerformanceFrequency

Цитата Сообщение от smartpointer Посмотреть сообщение
Стандартный вызов WinApi функции нужно вызывать правильно - так и запишем
пишите.

напишите какой нибудь простенький бенчмарк
с использованием QueryPerformanceFrequency


когда сталкнетесь с неожиданным резкими скачками
по среднестатистически отклонениям,
тогда - гребите.

не разгребе - приходите.
я когда то всю эту хрень уже разгребал.

а коли осилите разгребсти,
стало быть на собственной шкуре прочувствуете,
что нафиг все эти проблемы не нужны,
когда можно просто взять готовое, корректное,
стандартное, портируемое решение,
и не иметь никаких головняков.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2017, 12:55
Цитата Сообщение от smartpointer Посмотреть сообщение
В том то и дело, что "программисты" не могут написать что-то свое по причине лени\неумения\незнания.
Программистам платят деньги чтобы они писали быстрый и надёжный код в разумные сроки, а не возились с велосипедами.
Цитата Сообщение от smartpointer Посмотреть сообщение
И как вы можете утверждать, если своих велосипедов не писали ?
Писал, но одно дело - желание разобраться во внутреннем устройстве, а другое - использование языка для написания серьёзных программ.
Цитата Сообщение от smartpointer Посмотреть сообщение
Вы уверены, что любая функция из STL заработает одинаково правильно для MAC\Unix\Windows и заработает ли ?
Я уверен, что один не смогу написать такой же эффективный и корректный код, как команда программистов. В конце-концов, они уже шишки набили в подобной области, их код прошёл кучу тестов и его использует много людей. Вероятность ошибок там крайне мала.
Как связано
Цитата Сообщение от smartpointer Посмотреть сообщение
безопасность я вообще молчу
с
Цитата Сообщение от smartpointer Посмотреть сообщение
она уже достигается по дефолту большинством функций низкоуровневых реализаций WinApi
? То есть писать на голом API - хорошо, а использовать обёртки вокруг этих API (по сути упорядоченные вызовы нужных функций) - плохо?
Цитата Сообщение от smartpointer Посмотреть сообщение
Стандартный вызов WinApi функции нужно вызывать правильно - так и запишем
WinAPI функции сами по себе имеют избыточное количество параметров, при этом порядок следования их аргументов легко нарушить. Зубрить всю эту неудобную муть, написанную в сишном стиле - заниматься самобичеванием. Практически любое использование WinAPI функций - это предварительное чтение MSDN. Потому как интерфейс убог и легко позволяет допускать ошибки. Но вы о них можете даже не догадываться.
0
 Аватар для COKPOWEHEU
4069 / 2703 / 433
Регистрация: 09.09.2017
Сообщений: 12,022
17.11.2017, 13:28
Цитата Сообщение от MrGluck Посмотреть сообщение
WinAPI функции сами по себе имеют избыточное количество параметров, при этом порядок следования их аргументов легко нарушить. Зубрить всю эту неудобную муть, написанную в сишном стиле - заниматься самобичеванием.
Не надо клеветать на Сишный стиль. Этот вынос мозга характерен именно для winapi а не для Си.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.11.2017, 16:01
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Этот вынос мозга характерен именно для winapi а не для Си.
та там ещё по божески.

для си характерно мессиво из указателей и индексов.
ога.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
17.11.2017, 16:03
GbaLog-, Из личного опыта. Профилирование важная часть разработки. Но если мерить наносекундный код, микросекундным таймером, то ничего не выйдет. Если у вас както иначе, то сообщите пожалуйста. Я перепроверю. Щас просто дико занят, но в течении пары дней проверю.
0
 Аватар для COKPOWEHEU
4069 / 2703 / 433
Регистрация: 09.09.2017
Сообщений: 12,022
17.11.2017, 17:25
Цитата Сообщение от hoggy Посмотреть сообщение
для си характерно мессиво из указателей и индексов.
И вас, разумеется, не затруднит привести пример. Именно из Си, разумеется.
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
17.11.2017, 18:37
Цитата Сообщение от MrGluck Посмотреть сообщение
быстрый и надёжный код в разумные сроки, а не возились с велосипедами.
Быстрый и надежный такой, какой он есть в STL - это в перлы
Цитата Сообщение от MrGluck Посмотреть сообщение
То есть писать на голом API - хорошо, а использовать обёртки вокруг этих API (по сути упорядоченные вызовы нужных функций) - плохо?
Суть не в этом, если бы это были кросс-обертки ничего плохого не вижу в этом, а в куче ненужного мусорного кода - выплевывания эксепшинов, когда я явно запрещаю это делать.
Цитата Сообщение от MrGluck Посмотреть сообщение
Зубрить всю эту неудобную муть, написанную в сишном стиле - заниматься самобичеванием.
Это лучше, чем иметь мясо из ООП объектов и шаблонов, которые кстати тяжело представить бинарно.
Цитата Сообщение от hoggy Посмотреть сообщение
напишите какой нибудь простенький бенчмарк
с использованием QueryPerformanceFrequency
Я соглашусь с вами, сами функции WinApi не идеальны, но это по сути старые реализации еще под бородатые выни т.н легаси-код. Цель узнать приблизительную константу, которая вероятно для бенчмарков не пойдет.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.11.2017, 19:32
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И вас, разумеется, не затруднит привести пример. Именно из Си, разумеется.
разумеется затруднит.
на гитхабе забанили?
откройте любую сишную либину.

Добавлено через 8 минут
Цитата Сообщение от smartpointer Посмотреть сообщение
но это по сути старые реализации еще под бородатые выни т.н легаси-код.
да хорош пургу нести всякую уже.
0
 Аватар для COKPOWEHEU
4069 / 2703 / 433
Регистрация: 09.09.2017
Сообщений: 12,022
17.11.2017, 19:48
Любую? Хорошо, открываю библиотеку SDL, точнее, SDL2/SDL_video.h (это только кусок, комментарии вырезаны)
Кликните здесь для просмотра всего текста
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
extern DECLSPEC int SDLCALL SDL_GetWindowOpacity(SDL_Window * window, float * out_opacity);
extern DECLSPEC int SDLCALL SDL_SetWindowModalFor(SDL_Window * modal_window, SDL_Window * parent_window);
extern DECLSPEC int SDLCALL SDL_SetWindowInputFocus(SDL_Window * window);
extern DECLSPEC int SDLCALL SDL_SetWindowGammaRamp(SDL_Window * window,
                                                   const Uint16 * red,
                                                   const Uint16 * green,
                                                   const Uint16 * blue);
extern DECLSPEC int SDLCALL SDL_GetWindowGammaRamp(SDL_Window * window,
                                                   Uint16 * red,
                                                   Uint16 * green,
                                                   Uint16 * blue);
typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win,
                                                 const SDL_Point *area,
                                                 void *data);
extern DECLSPEC int SDLCALL SDL_SetWindowHitTest(SDL_Window * window,
                                                 SDL_HitTest callback,
                                                 void *callback_data);
extern DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window * window);
extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenSaverEnabled(void);
extern DECLSPEC void SDLCALL SDL_EnableScreenSaver(void);
extern DECLSPEC void SDLCALL SDL_DisableScreenSaver(void);
extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path);
extern DECLSPEC void *SDLCALL SDL_GL_GetProcAddress(const char *proc);
extern DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void);
extern DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char
                                                           *extension);
extern DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void);
extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value);
extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value);
extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window *
                                                           window);
extern DECLSPEC int SDLCALL SDL_GL_MakeCurrent(SDL_Window * window,
                                               SDL_GLContext context);
extern DECLSPEC SDL_Window* SDLCALL SDL_GL_GetCurrentWindow(void);
extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void);
extern DECLSPEC void SDLCALL SDL_GL_GetDrawableSize(SDL_Window * window, int *w,
                                                    int *h);
extern DECLSPEC int SDLCALL SDL_GL_SetSwapInterval(int interval);
extern DECLSPEC int SDLCALL SDL_GL_GetSwapInterval(void);
extern DECLSPEC void SDLCALL SDL_GL_SwapWindow(SDL_Window * window);
extern DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context);

Открываем fcntl.h есть ли более Си-шная либа?
Кликните здесь для просмотра всего текста
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
extern int openat (int __fd, const char *__file, int __oflag, ...)
     __nonnull ((2));
extern int __REDIRECT (openat, (int __fd, const char *__file, int __oflag,
                ...), openat64) __nonnull ((2));
extern int openat64 (int __fd, const char *__file, int __oflag, ...)
     __nonnull ((2));
extern int creat (const char *__file, mode_t __mode) __nonnull ((1));
extern int __REDIRECT (creat, (const char *__file, mode_t __mode),
               creat64) __nonnull ((1));
extern int creat64 (const char *__file, mode_t __mode) __nonnull ((1));
extern int lockf (int __fd, int __cmd, off_t __len);
extern int __REDIRECT (lockf, (int __fd, int __cmd, __off64_t __len), lockf64);
extern int lockf64 (int __fd, int __cmd, off64_t __len);
extern int posix_fadvise (int __fd, off_t __offset, off_t __len,
              int __advise) __THROW;
extern int __REDIRECT_NTH (posix_fadvise, (int __fd, __off64_t __offset,
                       __off64_t __len, int __advise),
               posix_fadvise64);
extern int posix_fadvise64 (int __fd, off64_t __offset, off64_t __len,
                int __advise) __THROW;
extern int posix_fallocate (int __fd, off_t __offset, off_t __len);
extern int __REDIRECT (posix_fallocate, (int __fd, __off64_t __offset,
                     __off64_t __len),
               posix_fallocate64);
extern int posix_fallocate64 (int __fd, off64_t __offset, off64_t __len);

Открываем alsa/control.h
Кликните здесь для просмотра всего текста
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
unsigned int snd_ctl_event_elem_get_mask(const snd_ctl_event_t *obj);
unsigned int snd_ctl_event_elem_get_numid(const snd_ctl_event_t *obj);
void snd_ctl_event_elem_get_id(const snd_ctl_event_t *obj, snd_ctl_elem_id_t *ptr);
snd_ctl_elem_iface_t snd_ctl_event_elem_get_interface(const snd_ctl_event_t *obj);
unsigned int snd_ctl_event_elem_get_device(const snd_ctl_event_t *obj);
unsigned int snd_ctl_event_elem_get_subdevice(const snd_ctl_event_t *obj);
const char *snd_ctl_event_elem_get_name(const snd_ctl_event_t *obj);
unsigned int snd_ctl_event_elem_get_index(const snd_ctl_event_t *obj);
 
int snd_ctl_elem_list_alloc_space(snd_ctl_elem_list_t *obj, unsigned int entries);
void snd_ctl_elem_list_free_space(snd_ctl_elem_list_t *obj);
 
char *snd_ctl_ascii_elem_id_get(snd_ctl_elem_id_t *id);
int snd_ctl_ascii_elem_id_parse(snd_ctl_elem_id_t *dst, const char *str);
int snd_ctl_ascii_value_parse(snd_ctl_t *handle,
                  snd_ctl_elem_value_t *dst,
                  snd_ctl_elem_info_t *info,
                  const char *value);
 
size_t snd_ctl_elem_id_sizeof(void);
/** \hideinitializer
 * \brief allocate an invalid #snd_ctl_elem_id_t using standard alloca
 * \param ptr returned pointer
 */
#define snd_ctl_elem_id_alloca(ptr) __snd_alloca(ptr, snd_ctl_elem_id)
int snd_ctl_elem_id_malloc(snd_ctl_elem_id_t **ptr);
void snd_ctl_elem_id_free(snd_ctl_elem_id_t *obj);
void snd_ctl_elem_id_clear(snd_ctl_elem_id_t *obj);
void snd_ctl_elem_id_copy(snd_ctl_elem_id_t *dst, const snd_ctl_elem_id_t *src);
unsigned int snd_ctl_elem_id_get_numid(const snd_ctl_elem_id_t *obj);
snd_ctl_elem_iface_t snd_ctl_elem_id_get_interface(const snd_ctl_elem_id_t *obj);
unsigned int snd_ctl_elem_id_get_device(const snd_ctl_elem_id_t *obj);
unsigned int snd_ctl_elem_id_get_subdevice(const snd_ctl_elem_id_t *obj);
const char *snd_ctl_elem_id_get_name(const snd_ctl_elem_id_t *obj);
unsigned int snd_ctl_elem_id_get_index(const snd_ctl_elem_id_t *obj);
void snd_ctl_elem_id_set_numid(snd_ctl_elem_id_t *obj, unsigned int val);
void snd_ctl_elem_id_set_interface(snd_ctl_elem_id_t *obj, snd_ctl_elem_iface_t val);
void snd_ctl_elem_id_set_device(snd_ctl_elem_id_t *obj, unsigned int val);
void snd_ctl_elem_id_set_subdevice(snd_ctl_elem_id_t *obj, unsigned int val);
void snd_ctl_elem_id_set_name(snd_ctl_elem_id_t *obj, const char *val);
void snd_ctl_elem_id_set_index(snd_ctl_elem_id_t *obj, unsigned int val);

Открываем hidapi/hidapi.h
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int HID_API_EXPORT HID_API_CALL hid_init(void);
int HID_API_EXPORT HID_API_CALL hid_exit(void);
struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);
void  HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs);
HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number);
HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path);
int  HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length);
int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds);
int  HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length);
int  HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock);
int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length);
int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length);
void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device);
int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen);
int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen);

Открываем vlc/libvlc.h
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LIBVLC_API
int libvlc_add_intf( libvlc_instance_t *p_instance, const char *name );
LIBVLC_API
void libvlc_set_exit_handler( libvlc_instance_t *p_instance,
                              void (*cb) (void *), void *opaque );
LIBVLC_DEPRECATED LIBVLC_API
void libvlc_wait( libvlc_instance_t *p_instance );
LIBVLC_API
void libvlc_set_user_agent( libvlc_instance_t *p_instance,
                            const char *name, const char *http );
LIBVLC_API
void libvlc_set_app_id( libvlc_instance_t *p_instance, const char *id,
                        const char *version, const char *icon );
LIBVLC_API const char * libvlc_get_version(void);
LIBVLC_API const char * libvlc_get_compiler(void);
LIBVLC_API const char * libvlc_get_changeset(void);

Это не одна любая либа, а 5 разных. Как видно, функции принимают обычно не более 5 параметров, чаще всего 1-2
Сравним с /usr/x86_64-w64-mingw32/include/winbase.h
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
  WINBASEAPI WINBOOL WINAPI LockFile (HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);
  WINBASEAPI DWORD WINAPI QueryDosDeviceW (LPCWSTR lpDeviceName, LPWSTR lpTargetPath, DWORD ucchMax);
  WINBASEAPI WINBOOL WINAPI ReadFileEx (HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
  WINBASEAPI WINBOOL WINAPI ReadFileScatter (HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[], DWORD nNumberOfBytesToRead, LPDWORD lpReserved, LPOVERLAPPED lpOverlapped);
  WINBASEAPI DWORD WINAPI SetFilePointer (HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
  WINBASEAPI WINBOOL WINAPI SetFileTime (HANDLE hFile, CONST FILETIME *lpCreationTime, CONST FILETIME *lpLastAccessTime, CONST FILETIME *lpLastWriteTime);
  WINBASEAPI WINBOOL WINAPI SetFileValidData (HANDLE hFile, LONGLONG ValidDataLength);
  WINBASEAPI WINBOOL WINAPI UnlockFile (HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh);
  WINBASEAPI WINBOOL WINAPI WriteFileEx (HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
  WINBASEAPI WINBOOL WINAPI WriteFileGather (HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[], DWORD nNumberOfBytesToWrite, LPDWORD lpReserved, LPOVERLAPPED lpOverlapped);
  WINBASEAPI WINBOOL WINAPI GetVolumeNameForVolumeMountPointW (LPCWSTR lpszVolumeMountPoint, LPWSTR lpszVolumeName, DWORD cchBufferLength);
  WINBASEAPI WINBOOL WINAPI GetVolumePathNamesForVolumeNameW (LPCWSTR lpszVolumeName, LPWCH lpszVolumePathNames, DWORD cchBufferLength, PDWORD lpcchReturnLength);

Как видно, аргументов в типичной Си-шной функции существенно меньше, чем в winapi-шной. Или все-таки приведете контрпримеры?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.11.2017, 20:33
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Как видно, аргументов в типичной Си-шной функции существенно меньше
как я и говорил:

вы ещё в реализацию не смотрели.
вот где адь и израель.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Или все-таки приведете контрпримеры?
вы меня ни с кем не попутали?
потому что я не занимался хренью подсчитывал
в каком сишном говнокоде больше аргументов

моя цитата:
Цитата Сообщение от hoggy Посмотреть сообщение
для си характерно мессиво из указателей и индексов.
0
 Аватар для COKPOWEHEU
4069 / 2703 / 433
Регистрация: 09.09.2017
Сообщений: 12,022
17.11.2017, 23:13
Опять мне за вас доказательства искать? Вот цитаты обсуждения:
Цитата Сообщение от MrGluck Посмотреть сообщение
WinAPI функции сами по себе имеют избыточное количество параметров, при этом порядок следования их аргументов легко нарушить. Зубрить всю эту неудобную муть, написанную в сишном стиле - заниматься самобичеванием.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Этот вынос мозга характерен именно для winapi а не для Си.
Цитата Сообщение от hoggy Посмотреть сообщение
та там ещё по божески.
для си характерно мессиво из указателей и индексов.
Итак, у вас появились возражения против "выноса мозга в функциях winapi с их избыточными параметрами" и что "эта муть характерна именно для winapi а не для Си"?
Цитата Сообщение от hoggy Посмотреть сообщение
вы ещё в реализацию не смотрели.
вот где адь и израель.
До тех пор пока библиотечные функции выполняют свою задачу - какая разница как они устроены? Пусть хоть на ассемблере будут написаны.
Цитата Сообщение от hoggy Посмотреть сообщение
для си характерно мессиво из указателей и индексов.
Давайте конкретнее. Приведите пример сишной функции (хотя бы из тех что я выписал, раз уж вам так лень самостоятельно искать), в которой "месиво указателей и индексов" и как это можно исправить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2017, 23:13

Как замерить время работы функции?
функция time не подходит, потому что нужна точность хотя бы до 1 милисекунды.

Замерить время выполнения базовых операций
собственно, нужно замерить время выполнени +-*/ для всех типов. делал следующим образом double empty = 0; Stopwatch...

Как замерить длительность выполнения кода?
Нужно замерить длительность выполнения кода. Как?

Как замерить время сортировки массива?
Как узнать время сортировки массива? masInt = Sort(masInt);

Используя О- символику, найдите время выполнения (как функции от N) процедуры или функции в наихудшем случае
Используя О- символику, найдите время выполнения (как функции от N) процедуры или функции в наихудшем случае. procedure mystery...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru