A.I.M. Jagged Alliance2

Добро пожаловать, Гость. Пожалуйста, выберите:
Вход || Регистрация.
29.03.2024 в 01:01:19

Главная Главная Помощь Помощь Поиск Поиск Участники Участники Вход Вход Регистрация Регистрация
A.I.M. « С++ Вопросы и ответы. »
   A.I.M.
   Генерал
   Ъ и Ь
(Модераторы: Снайпер, cha, Zed)
   С++ Вопросы и ответы.
« Предыдущая Тема | Следующая Тема »
  Тема:  С++ Вопросы и ответы.             Страниц: 1 2 3 4 5 6 7 Прочитано 48817 раз
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #200 от 18.04.2015 в 01:06:56 »

Народ, а тут кто-нибудь программирует с использованием OpenMP? А то я сейчас его осваиваю, по одному вопросу пребываю в недоумении, а спросить не у кого.
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

jarni
[Гарный хлопец]
Прирожденный Джаец

Мне нечего сказать.


Ё-мэйл

Пол:
Репутация: +306
Re: С++ Вопросы и ответы.
« Ответ #201 от 18.04.2015 в 01:11:19 »

2Ushwood: Увы, я нет.
Зарегистрирован

Don't worry, be happy.
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #202 от 18.04.2015 в 03:57:24 »

Пока суд да дело, возник вопрос просто по Visual studio.
 
Где сидит настройка компилятора, которая определяет, вычисляется логическое выражение до конца или до получения результата? И как оно по умолчанию?
« Изменён в : 18.04.2015 в 03:57:47 пользователем: Ushwood » Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

jarni
[Гарный хлопец]
Прирожденный Джаец

Мне нечего сказать.


Ё-мэйл

Пол:
Репутация: +306
Re: С++ Вопросы и ответы.
« Ответ #203 от 18.04.2015 в 04:01:33 »

Такой настройки нету потому что это поведение не настраивается, оно определено стандартом. ИЛИ вычисляется до первого ПРАВДА, И до первого ЛОЖНО.
Зарегистрирован

Don't worry, be happy.
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #204 от 18.04.2015 в 04:58:34 »

Спасибо.
 
Хм... то, что такой настройки нет, вызывает недоумение, но существующий вариант в большинстве случаев подходит :).
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

jarni
[Гарный хлопец]
Прирожденный Джаец

Мне нечего сказать.


Ё-мэйл

Пол:
Репутация: +306
Re: С++ Вопросы и ответы.
« Ответ #205 от 18.04.2015 в 05:09:43 »

То что такой настройки нет это большое счастье иначе на данную конструкцию невозможно бы было положиться и она бы потеряла весь смысл своего существования. Только представь себе, ты написал код
if (ptr && ptr->checksomething())
надеясь что второе выражение не будет исполнено если указатель нулевой, а кто-то взял и включил настройку которая заставляет исполнится оба выражения в обязательном порядке. Думаю что из данного примера становится очевидно что такая настройка уничтожила бы детерминизм, саму основу программирования.
Зарегистрирован

Don't worry, be happy.
Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +663
Re: С++ Вопросы и ответы.
« Ответ #206 от 18.04.2015 в 06:53:58 »

2Ushwood:  
 18.04.2015 в 04:58:34, Ushwood писал(a):
Хм... то, что такой настройки нет, вызывает недоумение, но существующий вариант в большинстве случаев подходит

А приведи вариант, в котором он не подходит? ;)
 
На самом деле все, мне кажется, проще: когда пишется условие - единственное, что нужно, это знать выполняется оно или нет. И чисто математически если часть условия И уже равна false (т.е. не выполняется) то и все условие целиком будет false. Тоже самое с ИЛИ.
На этом просто экономятся вычислительные мощности. Если ты пишешь что-то вроде
if(func1()&&func2()&&func3())
и вычисление каждой из этих функций занимает по 3 часа - логично потратив первые 3 часа на вычисление первой из них, если она однозначно указывает, что все условие не выполняется - не тратить еще 6, а сразу выйти.
Зарегистрирован

ban.gif
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #207 от 18.04.2015 в 07:13:17 »

2Korchy: представь себе, что в приведенном тобой примере эти func1() и прочие делают еще что-то, помимо собственно вычисления результатов функции. И тебе нужно не только значение логической конструкции, но и сопутствующие изменения других каких-то переменных.
У меня один раз был такой случай. Давно, когда я еще на Паскале программировал. Тогда я этим вопросом и озаботился... и там как раз эту вещь можно было настраивать. Потому-то я и удивился, что ее нельзя настраивать здесь.
Сейчас у меня не такой случай, а как раз ближе к тому, который выше привел Ярни, и именно поэтому, памятуя о своих прошлых приключениях с Паскалем, я задал здесь этот вопрос - чисто на всякий пожарный.
 
А про экономию вычислительных мощностей - это понятно и очевидно... как раз поэтому в большинстве случаев стандартный вариант и годится :).
« Изменён в : 18.04.2015 в 07:22:29 пользователем: Ushwood » Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

jarni
[Гарный хлопец]
Прирожденный Джаец

Мне нечего сказать.


Ё-мэйл

Пол:
Репутация: +306
Re: С++ Вопросы и ответы.
« Ответ #208 от 18.04.2015 в 07:40:40 »

2Ushwood: в случае если тебе надо выполнить независимые операции то ты не имеешь права использовать данную конструкцию, она сделана исключительно для того чтобы выполнять следующую операцию в зависимости от результата выполнения предыдущей. считай это ограничением языка на котором тебе приходится писать, увы.
Зарегистрирован

Don't worry, be happy.
Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +663
Re: С++ Вопросы и ответы.
« Ответ #209 от 18.04.2015 в 08:12:35 »

2Ushwood:  
Не могу на вскидку придумать пример, но вот как-то так:
 
int a = 2;
if(func1()&&func2()) return false;
else return true;
 
bool func2() {
if(a<3) {
a = 10;
return true;
}
else return false;
}
 
bool func1() {
if(a<5) return false;
else return true;
}
 
что должно вернуться в итоге при твоем подходе?
Зарегистрирован

ban.gif
Терапевт
[Кулибин]


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: С++ Вопросы и ответы.
« Ответ #210 от 18.04.2015 в 08:27:46 »

18.04.2015 в 05:09:43, jarni писал(a):
То что такой настройки нет это большое счастье иначе на данную конструкцию невозможно бы было положиться

В интерпретируемых языках на неё и нельзя без проверки полагаться. Не знаю, как в современных скриптовых, но в старых MS VB6/VBA/VBS, с которыми мне порой до сих пор приходится иметь дело, логическое условие выполняется целиком, что доставляет массу практических неудобств.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #211 от 18.04.2015 в 08:28:50 »

2Korchy: зачем придумывать заведомо парадоксальные конструкции? Такое, естественно, никто писать не будет.
Функция func2 может содержать какое-нибудь безобидное b++, которое в силу каких-то причин должно выполняться именно в функции func2.
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +663
Re: С++ Вопросы и ответы.
« Ответ #212 от 18.04.2015 в 09:21:15 »

2Ushwood:  
Мой парадоксальный пример должен был сказать - "не надо стрелять себе в ногу". Собственно он иллюстрирует слова Ярни о том, что нельзя смешивать логику выполнения  18.04.2015 в 07:13:17, Ushwood писал(a):
еще что-то, помимо собственно вычисления результатов функции

и собственно вычисления условия. Если в результате твоего безобидного b++ функция, которую ты уже просчитал будет возвращать не то значение, которое было до инкремента b, ты получишь тот же самый парадокс. Такие вещи не должны смешиваться иначе рано или поздно мой пример окажется очень реальным :)
« Изменён в : 18.04.2015 в 09:24:10 пользователем: Korchy » Зарегистрирован

ban.gif
jarni
[Гарный хлопец]
Прирожденный Джаец

Мне нечего сказать.


Ё-мэйл

Пол:
Репутация: +306
Re: С++ Вопросы и ответы.
« Ответ #213 от 18.04.2015 в 09:26:37 »

2Терапевт: Я, честно говоря, при упоминании Visual Studio автоматически подумал о С++ и из этого исходил, указывая что поведение описано в стандарте. С другими языками мне приходилось сталкиваться мало и все они в идеологии исходили из с/с++.
 
2Ushwood:  18.04.2015 в 08:28:50, Ushwood писал(a):
Такое, естественно, никто писать не будет.  
Ты был бы сильно удивлён... :) Мне тоже как-то удалось написать конструкцию напоминающую каконическую
int x = 7;
x = ++x + x++;
Пример Korchy вполне реально написать если не знать всего что делают функции (побочные эффекты о которых ниже), что есть нормально при использовании библиотечных функций.  
 
 18.04.2015 в 08:28:50, Ushwood писал(a):
Функция func2 может содержать какое-нибудь безобидное b++
Правила хорошего тона говорят что функция не должна иметь побочных эффектов, то есть, если есть функция которая выполняет b++ а также возвращает bool результат которого от b++ не зависит то код должен быть разделён на две функции. Понятно что в жизни это не всегда так, но тогда и конструкции надо подбирать соответсвующие, исходя из знания тела вызываемых функий.
Зарегистрирован

Don't worry, be happy.
Artem13
[13-й воин]
Прирожденный Джаец

Ап, и черти у ног моих сели...


WWW Ё-мэйл

Пол:
Репутация: +441
Re: С++ Вопросы и ответы.
« Ответ #214 от 07.04.2016 в 09:11:58 »

Народ, нарвался на задачку, придумать решение которой не могу.
Есть переменной длины (1000 +/- 5%) набор отсчетов. Нужно визуализировать его в жестко заданной сетке 300х600 пикселей с неизвестным заранее масштабом. Если ординату я могу отнормировать, то как это дело уложить по абсциссе - не представляю :( Проблема в том, что я не могу сделать плавающий предел, как и как-то изменить (отсечь или аппроксимировать) длину выборки (масштаб по абсциссе задан начальным и конечным значением). Единственное, что придумалось - проредить массив. Но я не могу придумать алгоритм, позволяющий это сделать при переменной его длине, да еще и так, чтобы он составил конкретную конечную длину (500-600).
Зарегистрирован

Artem13.gif
http://www.aap13.narod.ru
И пули, что найдет тебя,
Ты не услышишь,
А остальные мимо пролетят

jarni
[Гарный хлопец]
Прирожденный Джаец

Мне нечего сказать.


Ё-мэйл

Пол:
Репутация: +306
Re: С++ Вопросы и ответы.
« Ответ #215 от 07.04.2016 в 09:36:24 »

Если измерения идут с фиксированным интервалом тогда все ок, иначе будут дыры.  
1. Считаешь масштаб, скажем, 1079 измерений от 5 до 14 секунды на 600 пикселей. Это 15 мс на пиксель.  
2. В цикле с 15 мс шагом ищешь ближайшее измерение к данному времени, то есть ближайшее к t из интервала [t-dt/2, t+dt/2], где dt = 15, t это актуальное время в цикле.
3. Если нету никого близко тогда данный столбец останется пустым.
 
Из алгоритма видно что количество измерений не имеет значения, выборка проходит по фиксированному интервалу.
 
Кажется простым, но это может быть потому что я не на 100% понял задание. Может на бумаге нарисуешь что есть и чего хочешь достичь?
« Изменён в : 07.04.2016 в 09:38:55 пользователем: jarni » Зарегистрирован

Don't worry, be happy.
Artem13
[13-й воин]
Прирожденный Джаец

Ап, и черти у ног моих сели...


WWW Ё-мэйл

Пол:
Репутация: +441
Re: С++ Вопросы и ответы.
« Ответ #216 от 07.04.2016 в 10:16:04 »

2jarni: Ага, уловил. Что-то подобное крутилось в голове, но вот так алгоритмизировать не сумел. Вроде похоже на правду. Единственное - там масштаб абсцисс опосредованный, т.е. отсчёты берутся с постоянным ВРЕМЕННЫМ шагом, а масштаб - ток :) Т.е. известны начальный и конечный токи и характеристика его изменения между, но нет однозначного соответствия отсчитываемым значениям. Но попробую твой алгоритм применить к индексам исходного массива.
Зарегистрирован

Artem13.gif
http://www.aap13.narod.ru
И пули, что найдет тебя,
Ты не услышишь,
А остальные мимо пролетят

Artem13
[13-й воин]
Прирожденный Джаец

Ап, и черти у ног моих сели...


WWW Ё-мэйл

Пол:
Репутация: +441
Re: С++ Вопросы и ответы.
« Ответ #217 от 28.09.2016 в 09:49:43 »

I need help!!! Вернулся из "отпуска". Во время моего отсутствия винда (10) обновилась. Теперь Билдер 6 отказывается собирать проект - Linker Fatal Error Unable to open file VCLX.L  Кто знает, что с этим делать? Переустановка BCB6 не помогла :(
Зарегистрирован

Artem13.gif
http://www.aap13.narod.ru
И пули, что найдет тебя,
Ты не услышишь,
А остальные мимо пролетят

Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +663
Re: С++ Вопросы и ответы.
« Ответ #218 от 28.09.2016 в 10:25:39 »

Я даже с 7 виндой не смог шестой билдер корректно подружить. Выхожу из положения так - скачал vmware, поставил туда XP, расшарил папку с проектами и подключил ее в XP как диск, с которого и беру проекты в билдере. Единственный затык - достаточно медленное обращение по сети, тестировать живые сетевые проекты не особо удобно.
Зарегистрирован

ban.gif
Artem13
[13-й воин]
Прирожденный Джаец

Ап, и черти у ног моих сели...


WWW Ё-мэйл

Пол:
Репутация: +441
Re: С++ Вопросы и ответы.
« Ответ #219 от 28.09.2016 в 10:43:28 »

2Korchy: Не знаю, как сетевые сокеты и прочая фиговень - не работал, а с десктопными приложениями траблов не было и тут такой вот закидон. Напиться с горя, чтоли :( Давно надо было на Qt  перейти, да все лень было :(
Зарегистрирован

Artem13.gif
http://www.aap13.narod.ru
И пули, что найдет тебя,
Ты не услышишь,
А остальные мимо пролетят

Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +663
Re: С++ Вопросы и ответы.
« Ответ #220 от 28.09.2016 в 11:36:45 »

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

ban.gif
Artem13
[13-й воин]
Прирожденный Джаец

Ап, и черти у ног моих сели...


WWW Ё-мэйл

Пол:
Репутация: +441
Re: С++ Вопросы и ответы.
« Ответ #221 от 28.09.2016 в 13:24:49 »

Всё оказалось проще - какой-то левый мусор в файле проекта. Почистил файло ручками - все заработало.
Зарегистрирован

Artem13.gif
http://www.aap13.narod.ru
И пули, что найдет тебя,
Ты не услышишь,
А остальные мимо пролетят

Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #222 от 24.02.2017 в 15:41:48 »

Комрады, хочу проконсультироваться.
Я тут озаботился производительностью одной из своих программ. Прогнал ее через встроенный профилятор VS2015 и получил несколько озадачивших меня результатов. Оказалось, узкие места моей программы совсем не там, где я предполагал.
Вот один пример.

Прям так и хочется спросить: какого черта?
В строке 1069 всего одна операция умножения двух величин типа double. В строке 1067 одна операция умножения инта на дабл и одна операция сравнения. Почему первая занимает 2.2% времени, а вторая меньше 0.1% (иначе профайлер мне бы ее подсветил)?
Строка 1068 понятна, только если сравнивать со строкой 1069, - все-таки там два сложения, одно деление и одно умножение (sqr у меня оформлен как директива #define sqr(x) ((x)*(x)) ). А строка 1072 непонятна вообще. Там всего лишь сравнение двух даблов и проверка двух булевских условий (одно - глобальная контанта, второе - параметр), причем первое условие выполняется крайне редко, в 0.07% случаев.
Может кто-нить пояснить, что именно я не понимаю, а главное - как это можно вылечить?
Вот прицепился!       profile.jpg
« Изменён в : 24.02.2017 в 15:48:46 пользователем: Ushwood » Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #223 от 24.02.2017 в 15:55:21 »

Добавлю еще: чуть ниже по ходу этой функции идет вот такая строка:
if (bond_flag && bond_potential_flag && r2 > diam2*sqr(rrectmax))
  return 0;
Здесь первые две - булевские константы, равные 1, а в конце проверка условия с двумя умножениями. Так вот, она "весит" 3.6% против 7.1% у строки 1072. Никаких ветвлений между этими строками нет, return в строке 1073 почти никогда не выполняется...
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Терапевт
[Кулибин]


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: С++ Вопросы и ответы.
« Ответ #224 от 25.02.2017 в 14:27:05 »

24.02.2017 в 15:41:48, Ushwood писал(a):
Прям так и хочется спросить: какого черта?

Для ответа на этот вопрос надо смотреть, какой там получается ассемблерный код, как распараллеливаются инструкции конвеера. Операции с плавающей точкой очень ресурсоёмки в плане тактов процессора.
 
 24.02.2017 в 15:55:21, Ushwood писал(a):
Так вот, она "весит" 3.6% против 7.1% у строки 1072.  

В данном случае, возможно, имеет смысл для строки 1072 сравнение убрать в конец условия, чтобы сначала срабатывали простые логические проверки. Такие условия вычисляются не целиком, а до того момента, когда уже однозначно можно судить о результате.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #225 от 25.02.2017 в 15:22:16 »

25.02.2017 в 14:27:05, Терапевт писал(a):
В данном случае, возможно, имеет смысл для строки 1072 сравнение убрать в конец условия, чтобы сначала срабатывали простые логические проверки. Такие условия вычисляются не целиком, а до того момента, когда уже однозначно можно судить о результате.  
это-то я знаю. Но r2<diamcore дает true всего в 0.07% случаев (в том конкретном расчете), параметр hardcount - в 50% случаев, а hardcoreflag - константа, которая всегда равна 1. Я потому и поставил на первое место самое редко выполняющееся условие.
 
 25.02.2017 в 14:27:05, Терапевт писал(a):
Операции с плавающей точкой очень ресурсоёмки в плане тактов процессора.  
Это понятно, и я бы не задавал вопросов, будь в строке 1067 произведение двух интов. Но там же инт на дабл - неужели это в несколько десятков раз производительнее, чем дабл на дабл?
 
 25.02.2017 в 14:27:05, Терапевт писал(a):
Для ответа на этот вопрос надо смотреть, какой там получается ассемблерный код, как распараллеливаются инструкции конвеера.
Это вообще реально сделать? Тут я полный чайник :(.
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Терапевт
[Кулибин]


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: С++ Вопросы и ответы.
« Ответ #226 от 25.02.2017 в 16:40:55 »

25.02.2017 в 15:22:16, Ushwood писал(a):
это-то я знаю. Но r2<diamcore дает true всего в 0.07% случаев (в том конкретном расчете), параметр hardcount - в 50% случаев

Извини, но не знаешь. :)
Если ты поставишь на первое место проверку hardcount, то в 50% случаев до r2<diamcore дело вообще не дойдёт. А ты постоянно первым делом оцениваешь r2<diamcore, что по ресурсоёмкости намного больше простенькой проверки hardcount.
 
 25.02.2017 в 15:22:16, Ushwood писал(a):
Но там же инт на дабл - неужели это в несколько десятков раз производительнее, чем дабл на дабл?
 
Думаю, что в зависимости от точности результата раза в 2-3. Чтобы сказать точнее, нужно поднимать справочную информацию.
 
 25.02.2017 в 15:22:16, Ushwood писал(a):
Это вообще реально сделать?

Например, можно в отладчике посмотреть. Только это тебе мало что даст, без изучения ассемблера и правил оптимизации для распараллеливания команд.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #227 от 25.02.2017 в 17:32:55 »

25.02.2017 в 16:40:55, Терапевт писал(a):
Например, можно в отладчике посмотреть. Только это тебе мало что даст, без изучения ассемблера и правил оптимизации для распараллеливания команд.  
Ясно. То есть для меня сейчас тупик.
 
 25.02.2017 в 16:40:55, Терапевт писал(a):
Извини, но не знаешь. :)
Если ты поставишь на первое место проверку hardcount, то в 50% случаев до r2<diamcore дело вообще не дойдёт. А ты постоянно первым делом оцениваешь r2<diamcore, что по ресурсоёмкости намного больше простенькой проверки hardcount.
Это я сейчас решил проверить, не откладывая в долгий ящик. И... о сколько нам открытий чудных... : rolleyes :
 
Сделал в каждом из двух вариантов по три тестовых пуска, чтобы нивелировать флуктуации. Привожу для каждого из вариантов результаты, сооветствующие промежуточному общему времени выполнения.
39179eddd67d8767f87cac911c5b51db.jpg
 
1cfb5d47108a0362280ea8763e657867.jpg
 
Ты был прав, второй вариант посчитался быстрее. Среднее время выполнения тестовой задачи 11.5 с против 11.9 с. Но смотри, какую хрень выдает профайлер. Во втором случае на эту самую строку выпадает куда большая доля нагрузки, зато куда меньшая приходится на две предыдущие строки, которые вообще не менялись.
Нагрузка на саму функцию u в обоих вариантах одна и та же, ~50% от общего времени работы программы.
Начинаю подозревать, что профайлер глючит... :(
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Терапевт
[Кулибин]


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: С++ Вопросы и ответы.
« Ответ #228 от 25.02.2017 в 18:02:50 »

25.02.2017 в 17:32:55, Ushwood писал(a):
То есть для меня сейчас тупик.

Компиляторы этой фигнёй уже давно сами занимаются. Да и процессоры последовательность выполнения команд тоже умеют сами менять. Не заморачивайся.
 
 25.02.2017 в 17:32:55, Ushwood писал(a):
Начинаю подозревать, что профайлер глючит...  

Вполне возможно. Я вообще не представляю, как это можно оценивать в скомпилированном машинном коде, не засирая код дополнительным кодом. Если код интерпретируемый, как у большинства современных сред, то тогда такая оценка возможна.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #229 от 25.02.2017 в 18:06:46 »

2Терапевт: в любом случае спасибо за помощь :).
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +663
Re: С++ Вопросы и ответы.
« Ответ #230 от 25.02.2017 в 18:41:29 »

2Ushwood:  
Эх, сто лет уже не касался си, не помню уже ничего...
В первую очередь то, что сильно бросается в глаза - у тебя там куча обращений ко внешним и глобальным переменным. Если просто оставить в стороне аксиому, что глобальные переменные - зло, попробуй ради эксперимента передать их хотя бы указателями в тестируемую функцию. Возможно какое-то количество ресурсов тратится на проверки областей видимости и копание в куче тупо при обращении к глобалкам.
Зарегистрирован

ban.gif
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #231 от 25.02.2017 в 18:52:39 »

2Korchy: во, кстати. Много раз слышу в разных вариациях, что глобальные переменные - зло, но не разу не видел внятного объяснения, почему. Может, ты просветишь?
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Терапевт
[Кулибин]


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: С++ Вопросы и ответы.
« Ответ #232 от 25.02.2017 в 19:14:07 »

25.02.2017 в 18:52:39, Ushwood писал(a):
Много раз слышу в разных вариациях, что глобальные переменные - зло, но не разу не видел внятного объяснения, почему.

Только с точки зрения читаемости, общей архитектуры программы и контроля содержимого этих переменных.
 
 25.02.2017 в 18:41:29, Korchy писал(a):
Возможно какое-то количество ресурсов тратится на проверки областей видимости и копание в куче тупо при обращении к глобалкам.

Проверка области видимости существует только в рамках логики языка. После компиляции никаких проверок на это нет. Под глобальные переменные память, как правило, выделяется не из кучи (стека), а просто в области данных.
 
 25.02.2017 в 18:41:29, Korchy писал(a):
попробуй ради эксперимента передать их хотя бы указателями в тестируемую функцию.

При этом производительность упадёт, хотя и незначительно (или всёже заметно, если функция вызывается очень часто). Будет тратиться дополнительное время на загон в стек всех переменных функции или указателей на них.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #233 от 25.02.2017 в 19:17:28 »

25.02.2017 в 19:14:07, Терапевт писал(a):
При этом производительность упадёт, хотя и незначительно (или всёже заметно, если функция вызывается очень часто). Будет тратиться дополнительное время на загон в стек всех переменных функции или указателей на них.  
Вот, собственно, из этих соображений я и предпочитаю передавать в функцию в виде параметров только минимально необходимый набор переменных...
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +663
Re: С++ Вопросы и ответы.
« Ответ #234 от 25.02.2017 в 19:25:51 »

25.02.2017 в 19:14:07, Терапевт писал(a):
Проверка области видимости существует только в рамках логики языка. После компиляции никаких проверок на это нет. Под глобальные переменные память, как правило, выделяется не из кучи (стека), а просто в области данных.

Вполне возможно. Наверное уже все позабыл. Прям Дмитрием себя чувствую иногда :)
Но я бы все-таки попробовал бы ради эксперимента.
 
 25.02.2017 в 18:52:39, Ushwood писал(a):
внятного объяснения, почему

Потому, что ты никогда в точке обращения к глобальной переменной не знаешь точно, чему она равна. Потому как ты не знаешь, кто, где и когда ее поменял.
Грубо говоря, назначив глобальную переменную int a = 4. Ты периодически вполне можешь недоумевать, почему где-то в коде условие if(a==4) return true; else return false; упорно возвращает false. И долго и с матюками отыскивать в коде место, где же все-таки меняется значение переменной а.
Зарегистрирован

ban.gif
Bonarienz
[Хороший ариец]


Враг Джавдета в анимации ДжА2, Бон-а-рьен-ц!




Репутация: +346
Re: С++ Вопросы и ответы.
« Ответ #235 от 25.02.2017 в 19:36:41 »

По реке плывет баржа из села Кукуева
А у нас в селе живут программисты Зуевы
 
гы...
Зарегистрирован

Deleatur (лат.) - Стереть все, совсем все!
Round Owl
[Арбуз]
Прирожденный Джаец

Я люблю этот Форум!




Пол:
Репутация: +125
Re: С++ Вопросы и ответы.
« Ответ #236 от 18.05.2017 в 22:33:59 »

Понадобилось тут переписать небольшой кусок опенсорсного кода на С++, а потом собрать приложение обратно. У меня была установлена Visual Studio 2015 Community, обновил до VS 2017. Поставил Windows SDK, поставил (с бубном) DirectX SDK, всё равно возникают какие-то ошибки. Раньше собирал всё в MinGW и был счастлив. А как вы компилите свой код?
Зарегистрирован

"Now I am become Death, the destroyer of squirrels"
Уникальная методика лечения авиафобии!

Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #237 от 21.03.2018 в 16:27:25 »

Возникла тут дурацкая проблема.
У меня сишная программа, работающая с методом Монте-Карло, соответственно много-много-много раз вызывается генератор случайных чисел. И вот я заметил, что через какое-то время работы программа начинает повторяться, т.е. выводить в точности те результаты, которые уже выводила ...надцать минут назад. Т.е. генератор зациклился и пошел выдавать то же самое. Как с этим бороться?  
 
Я испробовал очевидный способ - через сколько-то минут переинициализировать генератор через srand(time(NULL)), но это не помогло.
 
Работаю в Visual Studio 2015, если это имеет значение.
« Изменён в : 21.03.2018 в 16:28:24 пользователем: Ushwood » Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Strax5
[Пятижды пуганый]
Прирожденный Джаец

Дорогу осилит бегущий


Ё-мэйл

Пол:
Репутация: +647
Re: С++ Вопросы и ответы.
« Ответ #238 от 21.03.2018 в 16:44:22 »

2Ushwood: http://www.fourmilab.ch/hotbits/ - теперь и с полонием!
Зарегистрирован

Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #239 от 21.03.2018 в 16:54:40 »

2Strax5: выглядит симпатично, но, если я правильно понял их английский, я не генерирую случайные числа у себя, а посылаю тем ребятам запрос на какое-то их количество.
Тут есть маленькая загвоздка: если мне нужно для каждого расчета несколько миллиардов или десятков миллиардов случайных чисел (я не шутил про "много-много-много раз"), у меня тупо будет проблема и с местом на винте для их хранения, со скачиванием этого массива и с производительностью программы.
« Изменён в : 21.03.2018 в 16:55:02 пользователем: Ushwood » Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

pipetz
[пипец всему!]
Прирожденный Джаец

Я очень люблю этот Форум!


Ё-мэйл

Пол:
Репутация: +303
Re: С++ Вопросы и ответы.
« Ответ #240 от 21.03.2018 в 18:44:42 »

21.03.2018 в 16:27:25, Ushwood писал(a):
Т.е. генератор зациклился и пошел выдавать то же самое. Как с этим бороться?  

Может вызывать srand(time(NULL)) перед каждым вызовом rand()?
Одним, словом надо какой-то источник энтропии подмешивать, если тебя не устраивает длинна периода ГПСЧ.
Или как вариант использовать в качестве "случайных" чисел последовательность знаков
какого-либо  
трансцендентного числа, которая заведомо не периодична.  
Зарегистрирован

- Джаец?
- Джаиц, джаиц.
- Ну, джаец, ну погоди!
https://github.com/egorovav/Ja2Project/releases

Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #241 от 21.03.2018 в 18:57:30 »

21.03.2018 в 18:44:42, pipetz писал(a):
Может вызывать srand(time(NULL)) перед каждым вызовом rand()?  
Так делать нельзя. Системное время не успеет сдвинуться, и новая инициализация будет тем же числом, что и предыдущая. Переинициализировать надо спустя какое-то время.
 
ЗЫ. Наткнулся на прелюбопытную ссылку, сейчас ее перевариваю: http://en.cppreference.com/w/cpp/numeric/random
Возможно, это то, что мне надо...  
Там упоминается Mersenne Twister - я когда-то читал про него, это очень хороший алгоритм генерации псевдослучайных чисел.
« Изменён в : 21.03.2018 в 19:01:11 пользователем: Ushwood » Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Zed
[SIG edition ;)]
A.I.M.Director

Была такая игра Z


Ё-мэйл

Пол:
Репутация: +532
Re: С++ Вопросы и ответы.
« Ответ #242 от 21.03.2018 в 20:25:31 »

21.03.2018 в 18:57:30, Ushwood писал(a):
Так делать нельзя. Системное время не успеет сдвинуться, и новая инициализация будет тем же числом, что и предыдущая. Переинициализировать надо спустя какое-то время.

Так делать нельзя потому что будет ухудшена случайность распределения.
Как оно работает:
https://pdfs.semanticscholar.org/6b0d/a7c081d9388f304bf6499db373b8d838bb...
А вот по этой ссылке как с этим жить можно жить на Windows
https://msdn.microsoft.com/en-us/library/bb982398.aspx
Зарегистрирован

Кровавый ГБист, душитель свободы.
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #243 от 21.03.2018 в 22:32:38 »

21.03.2018 в 20:25:31, Zed писал(a):
А вот по этой ссылке как с этим жить можно жить на Windows  
Ага, это аналогично тому, на что ссылку я привел выше. И я уже проверил, это работает. Спасибо :).
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

pipetz
[пипец всему!]
Прирожденный Джаец

Я очень люблю этот Форум!


Ё-мэйл

Пол:
Репутация: +303
Re: С++ Вопросы и ответы.
« Ответ #244 от 21.03.2018 в 22:51:40 »

21.03.2018 в 18:57:30, Ushwood писал(a):
Системное время не успеет сдвинуться

Ну это тебе виднее, конечно, успеет у тебя сдвинуться или нет.
 
21.03.2018 в 20:25:31, Zed писал(a):
Так делать нельзя потому что будет ухудшена случайность распределения.  

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

- Джаец?
- Джаиц, джаиц.
- Ну, джаец, ну погоди!
https://github.com/egorovav/Ja2Project/releases

Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #245 от 14.05.2018 в 16:45:57 »

21.03.2018 в 20:25:31, Zed писал(a):
А вот по этой ссылке как с этим жить можно жить на Windows
https://msdn.microsoft.com/en-us/library/bb982398.aspx
 
А есть ли какие-нибудь идеи, как с этим можно жить на Линуксе?
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Zed
[SIG edition ;)]
A.I.M.Director

Была такая игра Z


Ё-мэйл

Пол:
Репутация: +532
Re: С++ Вопросы и ответы.
« Ответ #246 от 15.05.2018 в 11:39:32 »

2Ushwood:  
а есть какая то проблема? Где затык то получился?
А так вызывай http://man7.org/linux/man-pages/man2/getrandom.2.html
и радуйся жизни.
Зарегистрирован

Кровавый ГБист, душитель свободы.
Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #247 от 20.05.2018 в 14:42:19 »

2Zed: извиняй, что долго не отвечал, просто как-то внезапно стало не до этого.
 
 15.05.2018 в 11:39:32, Zed писал(a):
а есть какая то проблема? Где затык то получился?  
Проблема в том, что то решение, похоже, сугубо для ВижуалСтудии, и при попытке скомпилировать его на линуксе компилятор пишет, что знать не знает такого зверя, как random_device, ну и всех последующих.
 
 15.05.2018 в 11:39:32, Zed писал(a):
А так вызывай http://man7.org/linux/man-pages/man2/getrandom.2.html
и радуйся жизни.  
Это я пока не делал,. потому что см. начало поста. Как сделаю, отпишусь, что такое хорошо и что такое плохо.
Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

Ushwood
[ДжАдай]
Прирожденный Джаец

May the Force be with you


WWW Ё-мэйл

Пол:
Репутация: +562
Re: С++ Вопросы и ответы.
« Ответ #248 от 14.02.2019 в 18:59:54 »

Камрады, помогите, пожалуйста, разобраться с проблемой.
 
Есть вот такой код:
Code:
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
 
const int mapsize = 8127;
const int maxboxes1type = 2000000;  // max number of matrix boxes of certain type
 
FILE *in;
int i, j, k;
float *map1aa, *map10, *map1ii, *map1ai, *map1aaai, *map1iiai, *map1aaiiai, *map1h;
int aig[2][mapsize][2], aing[2][mapsize][2];  // 1st index - for different activity thresholds, 3rd - inactive(0)/active(1)
double expr[mapsize];  // sum expression level of all genes in the segment.
double exprnongene[10][mapsize]; // sum expression level of all nongenes in the segment, divided into types.
double cntnum_actinact[2][mapsize][5];  // in 2nd index: 1st field - total length of active genes in the bin, 2nd - of inactive genes, 3rd - of active NONgenes, 4th - of inactive NONgenes, 5th - of empty space
double distr_cnt_type[7][maxboxes1type]; // 1st index: aa, ii, 00, ai, a0, i0, complex
 
void init()
{
      map10 = (float*)malloc(mapsize * mapsize * sizeof(float));
      map1aa = (float*)malloc(mapsize * mapsize * sizeof(float));
      map1ii = (float*)malloc(mapsize * mapsize * sizeof(float));
      map1ai = (float*)malloc(mapsize * mapsize * sizeof(float));
      map1aaai = (float*)malloc(mapsize * mapsize * sizeof(float));
      map1iiai = (float*)malloc(mapsize * mapsize * sizeof(float));
      map1aaiiai = (float*)malloc(mapsize * mapsize * sizeof(float));
      map1h = (float*)malloc(mapsize * mapsize * sizeof(float));
      for (i = 0; i < 2; i++) for (j = 0; j < mapsize; j++) for (k = 0; k < 2; k++) aig[i][j][k] = aing[i][j][k] = 0;
      for (j = 0; j < mapsize; j++) expr[j] = 0;
      for (j = 0; j < mapsize; j++) for (k = 0; k<10; k++) exprnongene[k][j] = 0;
      for (j = 0; j < mapsize; j++) for (k = 0; k < mapsize; k++) {
            *(map10 + j*mapsize + k) = *(map1aa + j*mapsize + k) = -1;
            *(map1ii + j*mapsize + k) = *(map1ai + j*mapsize + k) = -1;
            *(map1aaai + j*mapsize + k) = *(map1iiai + j*mapsize + k) = -1;
            *(map1aaiiai + j*mapsize + k) = *(map1h + j*mapsize + k) = -1;
      }
      for (i = 0; i < mapsize; i++) for (j = 0; j < 5; j++) cntnum_actinact[0][i][j] = cntnum_actinact[1][i][j] = 0;
      for (i = 0; i < maxboxes1type; i++) for (j = 0; j < 7; j++) distr_cnt_type[j][i] = -1;
}
 
int main()
{
      init();
      free(map10);
      free(map1aa);
      free(map1ii);
      free(map1ai);
      free(map1aaai);
      free(map1iiai);
      free(map1aaiiai);
      free(map1h);
}

 
Это небольшой фрагмент моей прграммы (только инициализатор переменных). Прога работала при сравнительно небольших значениях mapsize (около 1000), но с 8000 она вылетает. На 36 строке, вот этой:
*(map1aaai + j*mapsize + k) = *(map1iiai + j*mapsize + k) = -1;
с диагнозом "access violation writing location".
 
Я понимаю, что это какие-то проблемы с памятью, но впервые сталкиваюсь именно с таким их проявлением. Обычно прога либо на стадии компиляции выдает ошибку, что я слишком много памяти прошу, либо вылетает на входе в какую-нибудь функцию со словами "stack overflow".
 
Подскажите, пожалуйста, что конкретно ей не нравится и как с этим можно бороться.
Уменьшить mapsize не вариант, т.е. задача - не уменьшить количество потребляемой памяти (я и так его уменьшил, заменив double на float), а убедить прогу выполняться вот с таким, какое есть.
 
Работаю в Visual Studio 2015.
 
ЗЫ. В первоначальной версии программы все вот эти map1... были двумерными массивами, но там было ровно то же самое: прога компилируется, потом вылетает с этим же диагнозом. Я переписал на указатели в надежде, что поможет, - не помогло.
« Изменён в : 14.02.2019 в 19:04:22 пользователем: Ushwood » Зарегистрирован

Мои текущие переводы:
Червь арка 30, версия 24.03.24

jarni
[Гарный хлопец]
Прирожденный Джаец

Мне нечего сказать.


Ё-мэйл

Пол:
Репутация: +306
Re: С++ Вопросы и ответы.
« Ответ #249 от 14.02.2019 в 19:04:29 »

Или компилируй как х64, или попробуй включить LARGE_ADDRESS_AWARE в настройках линкера (или компилятора, не помню). Ты создал массивов на больше чем 2ГБ, без LARGE_ADDRESS_AWARE ты можешь обращаться как раз к адресам до двух ГБ.
Зарегистрирован

Don't worry, be happy.
Страниц: 1 2 3 4 5 6 7  Послать Тему Послать Тему Печатать Печатать

« Предыдущая Тема | Следующая Тема »

Статистика. Размер данных: 176107 GZip: off
A.I.M. » Powered by YaBB Modification 4 (v.4.0.0-pre)!
YaBB © 2000-2003. All Rights Reserved.