И вопрос по настройке текущих предупреждений.
Сейчас анализатор умеет присматривать за printf-like функциями. Но предположим, у меня есть функция
void WriteLog(const char* format, ...);
и как оказалось, у меня с ней тоже есть проблемы. То к %s пихается std::string, то char* же пихается в %S. Хотелось бы возможность комментарием включать проверку использования этой функции.
Т.е. либо как так:
//vXXX: addFunc: foo
или используя аннотации:
С_«void WriteLog(...»
ADD(F_PRINTF)
На самом деле есть диагностики особенно по микрооптимизации, которые можно сразу бы и поправить. На вскидку:
— замена str.find(«c»); на str.find('c');
— замена strstr(«c») на strchr('c');
— удаление объявленых, но не используемых переменных
— замена const Type var на const Type& var в параметрах функций
— что-то ещё было, но сейчас не могу вспомнить
Массовое подавление предупреждений, возникающих из-за макроса. Это также осуществляется с помощью специальных комментариев.
А можно поподробнее эту тему развить. У меня проблема с Q_ASSERT'ом. Этот макрос определён как
#if !defined(Q_ASSERT)
# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
# define Q_ASSERT(cond) do { } while ((false) && (cond))
# else
# define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop())
# endif
#endif
Поэтому если в коде есть строчки типа
void foo()
{
Q_ASSERT(false);
}
то выдаётся предупреждение на функцию foo вида:
full_filename.cpp (400): error V501: There are identical sub-expressions to the left and to the right of the '&&' operator: (false) && (false)
Как оказалось, в коде таких мест оказалось неприлично много. Хотелось бы как-то едино их погасить, без добавления по всему репозиторию комментариев. Т.е. чтобы можно было написать что-то типа:
//-V501:Q_ASEERT
внутри парочки конфиг-файлов, которые во все проекты включаются, чтобы внутри макроса Q_ASSERT такого ворнинга не возникало.
Ну и на самом деле я удивлён, как вам программисты-qt'шники ещё не жаловались на такое.
Жалко нет никакого опраса. Интересно сколько ещё людей ей пользуются. У меня коллеги постепенно сдаются, уже всего 2 осталось кроме меня, кто на 12й версии сидит. Да и я уже дома на Я.Браузер перешёл.
Вроде нет. Среднее время всё равно около этих 500 микросекунд. Т.е. за секунду каждое ядро может опрашивать (и в 99% после этого выгребсти расжатый кадр) аппаратный декомпрессор 2000 раз. Всего 8000 раз в секунду в среднем на процессор выходит. Мы такой поток кадров не можем в него дать.
Помню, люди, которые держали игровые сервера Counter-Strike на Windows, запускали специально Windows Media Player на сервере, чтобы увеличить tickrate и уменьшить «лагучесть» в игре (-:
Вообще, если память мне не изменяет, то на 200-х потоках, мы так и не достигли своей цели, расжималось что-то около 180 потоков (ну т.е. 4500 кадров в секунду, при нужных 5000).
Там возникают другие проблемы. Вплоть до того, что на накладных расходах много теряется. да и просто 200 мегов только на стеки — это уже много. Да и отлаживаться потом с таким кол-вом потоков сложновато будет. Тут пул-потоков — самое очевидное решение.
Да и вообще 25 fps — это 1 кадр в 40 миллисекунд. Т.е. нам надо, чтобы раз в 40 миллисекунд винда нам выделяла хоть немного времени, чтобы мы успели выгребсти результат предыдущего декодирования, вернули его наверх, нам чтобы спустили новую порцию данных, которые мы бы также запихнули в декомпрессор. Предположим, что винда переключает потоки раз в 15 миллисекунд, т.е. за это время на 4-х ядерном проце успее поработать всего 12 потоков. Пусть мы реально быстро делаем подобные операции (выгребсти ...., запихнуть), скажем 1 миллисекунду, и тут же вызываем yield, чтобы остаток кванта отдать другому потоку. (Ну либо точность таймера 1 миллисекунда). В таком случае, успеет поработать 40*4 = 160 потоков. Хм. что-то всё равно не сходится, надо подумать. Вроде как вариант с 200-та потоками работал (но плохо).
Так так и делаем. Только ядра-то всего 4.
Смотрите, очевидно, что со слипом в 1 миллисекунду, за 1 секунду можно разжать 1000 кадров. Это на одном ядре. При среднем fps равным 25, это всего 40 потоков. Т.е. на 4-х ядерном проце получается всего 160 потоков (4000 кадров в секунду). А цель: 200 потоков, т.е. 200 * 25 = 5000 кадров в секунду.
Показал сейчас 6-рым коллегам, из них у 3 айфоны, у 2-х на андроиде, у 1 на винде. Ну, реакция от сдержанной до смешной. Корреляция реакции с моделью телефона есть :-(. Не всё так критично, как здесь произошло :-(
nikolaynnov: — Какую связь лямбры имеют с stl-контейнерами? Jef239: — А где они ещё нужны? Типовой пример из вики
std::vector<int> someList;
int total = 0;
std::for_each(someList.begin(), someList.end(), [&total](int x) {
total += x;
});
std::cout << total;
…
… Jef239: — Ну как пример foreach. Куча языков имеют его как языковую конструкцию. И С++ тянется к тому. Но вместо того, чтобы программно реализовать новое ключевое слово, используютяс костыли ввиде темплейтов и лямбд. 0xd34df00d: — Вообще-то уже шесть лет как дотянулся. Вы вообще знаете предмет вашей критики или по-прежнему в 98-м году? Jef239: — Тогда зачем вы дает пример лямбд с std::for_each? Мест, где они реально нужны, не нашлось?
s[0] = 'K' читабельнее, вызывает меньше WTF и вообще.
Я бы на ревью такой код без комментария, что это сделано специально для какой-то адовой оптимизации тоже не пропустил бы. Да и с коментарием тоже подумал бы ещё. Обычно, если не нужна больше ворона, и хочешь корону, пиши полностью, s = «корона»;
Сейчас анализатор умеет присматривать за printf-like функциями. Но предположим, у меня есть функция
void WriteLog(const char* format, ...);
и как оказалось, у меня с ней тоже есть проблемы. То к %s пихается std::string, то char* же пихается в %S. Хотелось бы возможность комментарием включать проверку использования этой функции.
Т.е. либо как так:
//vXXX: addFunc: foo
или используя аннотации:
С_«void WriteLog(...»
ADD(F_PRINTF)
— замена str.find(«c»); на str.find('c');
— замена strstr(«c») на strchr('c');
— удаление объявленых, но не используемых переменных
— замена const Type var на const Type& var в параметрах функций
— что-то ещё было, но сейчас не могу вспомнить
А можно поподробнее эту тему развить. У меня проблема с Q_ASSERT'ом. Этот макрос определён как
Поэтому если в коде есть строчки типа
то выдаётся предупреждение на функцию foo вида:
Как оказалось, в коде таких мест оказалось неприлично много. Хотелось бы как-то едино их погасить, без добавления по всему репозиторию комментариев. Т.е. чтобы можно было написать что-то типа:
//-V501:Q_ASEERT
внутри парочки конфиг-файлов, которые во все проекты включаются, чтобы внутри макроса Q_ASSERT такого ворнинга не возникало.
Ну и на самом деле я удивлён, как вам программисты-qt'шники ещё не жаловались на такое.
Здесь написано как.
gag_fenix:
Э, а по обычному NFC есть какие ограничения? [пытаюсь судорожно припомнить максимальную сумму, которую я оплачивал]
В пробовали, но что-то не дотягивали. В итоге вернулись к пулу потоков ик слипу в 0.5 миллисекунды.
Да и вообще 25 fps — это 1 кадр в 40 миллисекунд. Т.е. нам надо, чтобы раз в 40 миллисекунд винда нам выделяла хоть немного времени, чтобы мы успели выгребсти результат предыдущего декодирования, вернули его наверх, нам чтобы спустили новую порцию данных, которые мы бы также запихнули в декомпрессор. Предположим, что винда переключает потоки раз в 15 миллисекунд, т.е. за это время на 4-х ядерном проце успее поработать всего 12 потоков. Пусть мы реально быстро делаем подобные операции (выгребсти ...., запихнуть), скажем 1 миллисекунду, и тут же вызываем yield, чтобы остаток кванта отдать другому потоку. (Ну либо точность таймера 1 миллисекунда). В таком случае, успеет поработать 40*4 = 160 потоков. Хм. что-то всё равно не сходится, надо подумать. Вроде как вариант с 200-та потоками работал (но плохо).
Смотрите, очевидно, что со слипом в 1 миллисекунду, за 1 секунду можно разжать 1000 кадров. Это на одном ядре. При среднем fps равным 25, это всего 40 потоков. Т.е. на 4-х ядерном проце получается всего 160 потоков (4000 кадров в секунду). А цель: 200 потоков, т.е. 200 * 25 = 5000 кадров в секунду.
nikolaynnov: — Какую связь лямбры имеют с stl-контейнерами?
Jef239: — А где они ещё нужны? Типовой пример из вики
…
…
Jef239: — Ну как пример foreach. Куча языков имеют его как языковую конструкцию. И С++ тянется к тому. Но вместо того, чтобы программно реализовать новое ключевое слово, используютяс костыли ввиде темплейтов и лямбд.
0xd34df00d: — Вообще-то уже шесть лет как дотянулся. Вы вообще знаете предмет вашей критики или по-прежнему в 98-м году?
Jef239: — Тогда зачем вы дает пример лямбд с std::for_each? Мест, где они реально нужны, не нашлось?
Я бы на ревью такой код без комментария, что это сделано специально для какой-то адовой оптимизации тоже не пропустил бы. Да и с коментарием тоже подумал бы ещё. Обычно, если не нужна больше ворона, и хочешь корону, пиши полностью, s = «корона»;