|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Решена задача МКЭ для расчета объемной задачи теории упругости. Для матрицы системы размером 10000 степеней свободы, ее фрагментация на 2 треугольные (прямой ход по гауссу) занял 1 час 20 минут, это очень много. Должно быть примерно 10 секунд. Учтена ленточная симметричная форма матрицы и обход нулей. Используемый тип данных 4-х байтовый, float. Компилятор Microsoft Visual C# 2010 Express Edition. Хотя наверно не в компиляторе дело. Структура программы - одно пространство имен, один класс, переменные объявляются в функции Main посредством new. Переменные для вычислений передаются в другие функции как аргументы. Другие функции вызываются в Main через один и тот же объект ob. Все эти функции public, в основном void. Может, я запускал программу из отладчика? Но я не нашел других команд меню. Отладка -> построить решение. Или на панели Построение кнопка Построить. В папке проекта есть bin, в ней Release, в ней исполняемый exe. Считает правильно, но медленно. В процессе счета переменные находятся в оперативной памяти, с жесткого диска ничего не читается Могу выслать исходник и текстовые файла с вводными данными, если кому интересно мне помочь ... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 01:05 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решетка, ежли матрица 10К*10К, то элементов 100М. приведение к треугольному виду 100М операций деления. секунда, две не более. ну 10 секунд ( если совсем старый проц) для решения подобных задач используется один 2мерный массив, временная переменаня и функции прохода по строкам. что там ещё можно создавать оператором new? явно что то в логике проги не так. нет ли случаем в проге LINQ? пс. тут телепатов мало. и хрустальных шаров дефицит. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 01:58 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решетка, если программа выводит что-то в консоль во время расчетов, то убери их или уменьши их кол-во т.к. вывод в консоль работает медленно. Изучающий си решеткафрагментация на 2 треугольные занял 1 час 20 минут, это очень много. Должно быть примерно 10 секунд Откуда цифра в 10 секунд взялась? Сравнивал с чужой программой? Я не знаю что такое фрагментация матрицы в задаче МКЭ, но возможно ее решение можно распаралелить и ускорить поиск решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 02:03 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткаРешена задача МКЭ... Use CLR Profiler Luke. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 03:31 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
beg-in-er, 10K*10K, здесь К - это килобайт? но тогда 10000 float это 4 байта * 10000 = 40000 байт = 40К (примерно)? Тогда матрица будет не 100M, а 1600M? М - это мегабайт, да? Процессор у меня 1,3ГГц, оперативной памяти 4ГБ. Оператор new в процессе проходки не используется, new только задает (в данном случае) переменную, массив 10000х10000, в который помещается матрица исходная. То что вывод в консоль предусмотрен, это ни при чем, и с ним и без него одинаково работает. Вот исходник в приложенном файле, этот пресловутый прямой ход по Гауссу - строки в тексте программы с 637 по 686. И вообще вся прога медленно работает, и подготовка матрицы, и обратный ход тоже медленный. Еще интересно, думал что заменить тип данных с double на float, это раза в два как минимум ускорит, а выигрыш по времени получился всего-то процентов на 30-40 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 09:35 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решетка, это точно ваш код. это просто неописуемое зрелище. Функция main 700 строк, да с такими вкраплениями... даже сложно сказать , где там что не так Код: 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.
хотя.....странно вы сами считаете матрица 10К*10К , даэто 10.000 на 10.000 элементов. т.е. 100.000.000 элементов. по 4 байта это будет 400Мб , а не 1.6 Гб предметно. методы урежте в размерах. и выясните , какой метод тормозит. с замерами. а то боюсь вы и сами не в курсах , где тормоза идут. пишите в лог, и думайте. пс. код просто Жесть. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 10:22 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решетка, выложи все файлы с данными которые нужны для работы программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 11:07 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
beg-in-er, да, правильно, объем матрицы 400Mb. Это я умножил конфеты на конфеты, а нужно умножать конфеты на их количество. Все правильно, 400М Эта матрица довольно разреженная, хотя и с широкой лентой (ширина ленты почти равна количеству строк). При решении этой же задачи на коммерческой настоящей МКЭ программе гаусс занял 9 секунд. Процессор машины был в два раза быстрее. Рациональная перенумерация узлов дала ширину ленты 1900. Суммируя это, можно сказать что на моей машине в моей проге гаусс должен был бы занять примерно 1,5 минуты. То есть у меня проигрыш по времени примерно в 100 раз, не больше. А это тормозит, если например создавать не массив, а много отдельных переменных со своими именами и обращаться к ним по их именам? Как мне кажется, не должно тормозить. Или это плохо, организовавать самый нагруженный вычислительный цикл for в составе Main? Объявлять переменные внутри Main это тормозит? Лучше объявлять переменные в классе и обращаться к ним через объект? То что код ЖЕСТЬ, согласен. Пою как могу, пускай что слуха нет ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 11:23 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
bazile, вот они. Там и readme есть. Задача поменьше, 1500х1500 примерно Еще непонятно, прога считает нормально только на той машине, где скомпилирована. Хотя и там и там семерка стоит. На одной home basic, на другой обычная ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 11:58 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
beg-in-erпс. код просто Жесть. Можно сознание потерять, читая этот дикий код... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 13:16 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткавот они. Там и readme есть. Задача поменьше, 1500х1500 примерно На моей машине этот пример отрабатывает за пару секунд. Дай пример который занимает больше часа на твоей машине. Без него нельзя будет нормально измерить на что именно столько времени уходит. Код: c# 1.
Что значит "считает нормально"? Результат неправильный? Падает с ошибкой? Кстати, у тебя в программе баг связанный с преобразованием string в float. Ты исходишь из того что разделитель целой и дробной части всегда точка. Это не так. Чтобы не было проблем надо явно указать культуру при преобразовании или в начале main поставить Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 16:06 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
bazile, эта задача занимала больше часа. на другой машине не работает, это значит что рассчитываются только небольшие задачи размером 100-200. Если больше, то возможны два варианта: 1) ничего не вылетает, но в результатах NaN. Как будто были деления на ноль. 2) задача вылетает, с сообщением что памяти мало. может так быть, что бесплатный компилятор от microsoft плохо подходит для обработки большого объема данных, или я неправильно его использую? Прежде чем компилировать конечный продукт, нужно делать какие-либо настройки компилятора? По поводу запятой в действительном числе, у меня их в принципе не может быть, исходные данные я генерю автолисп-файлом из CAD-программы. Но про эту инфу спасибо, погуглю что это такое и как применять ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 17:55 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решетка, автор задача вылетает, с сообщением что памяти мало. и сколько она памяти кушает , когда час работает? и сколько на компе ОЗУ? ( и какая целевая платформа х86? и какой пень? интел иль амд.) зы . предьявы к компилятору и прочие орг вопросы тут нипричём. не они причина тормозов. проблема либо в нехватки ОЗУ, либо, что вероятнее - реализация алгоритма швах. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 18:10 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Задачи из Documents2.rar посчиталась за 20 минут. i5 (использовалось 1 ядро) 8гб оперативки. (использовалось 500мб). 99% времени работы программы пришлось на 2 цикла на 50 строк кода. значит имеет смысл попробовать оптимизировать их. если конечно задача позволяет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 23:02 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
FsShoman, скинь мне пожалуйста exe, который 20 минут считал. Мой комп W7 Домашняя расширенная, Service Pack1, процессор Intel Pentium CPU 967 @ 1.3HGz, оперативки 4Гб, 64-разрядная система. Это ноутбук Acer Aspire V5-5 Series с диагональю 15 дюймов, стоил 16000руб. Может быть что 20 минут близко к истине, потому что задача в Documents2 имела широкую ленту, почти равную размерности задачи. А узкая лента сильно сокращает общий объем вычислений, причем не знаю, пропорционально ли ширине ленты. Еще спрашивали какая целевая платформа, x86? К сожалению не знаю что это такое и где посмотреть ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 23:39 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решетка, тоже собирал под x86, под x64 прироста не добавило. сейчас решил 1 оптимизацию попробовать. поэтому екзешника не осталось. код уже измененный. сейчас доделаю, если спать не уйду, то скину. или с утра уже. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 23:44 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
FsShoman, да давай завтра. Попробую на настоящей программе для сравнения большое кольцо рассчитать. У кольцевой схемы по определению должна быть широкая лента. Если результаты будут по продолжительности счета близкие, то может зря я народу голову морочил ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 23:54 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткаFsShoman, да давай завтра. Попробую на настоящей программе для сравнения большое кольцо рассчитать. У кольцевой схемы по определению должна быть широкая лента. Если результаты будут по продолжительности счета близкие, то может зря я народу голову морочил ну соглядайте. ваша матрица из Documents2.rar (если она 1.5К*1.5К) жрёт 360 метров. можно предположить, что 10К*10К жрёт в 44 раза больше. т.е. около 16Гигов. ну очевидно, что если столько ОЗУ нет, то будет постоянная работа с винтом ))) отсюда и такая скорость. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 23:59 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
beg-in-er, нет, в Documents2 уже залита матрица 10К*10К, точно. А 1.5К*1.5К была в Documents первом. Так что оперативки всегда и у всех хватало, когда я считал у себя, открывал диспетчер задач. Не помню точно, но свободной памяти много было, несколько сот Mb ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 00:08 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткаbeg-in-er, нет, в Documents2 уже залита матрица 10К*10К, точно. А 1.5К*1.5К была в Documents первом. Так что оперативки всегда и у всех хватало, когда я считал у себя, открывал диспетчер задач. Не помню точно, но свободной памяти много было, несколько сот Mb Я скачал исходник. Сначала ужаснулся. Потом в голову пришла мысль что исходник генерится чем-то. Потом закралась мысль а вдруг не генеренная и что автор вундеркинд. Я без подколов исключительно с добрыми намерениями говорю это. Развейте мои заблуждения. Попробую тоже поколупаться. Не знаю на сколько меня хватит только :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 00:41 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
InvarianCulture? пришлось переставить региональные настройки чтобы заработало. Бросилось в глаза с какой целью делается так в некоторых функциях, которые участвуют в циклах Program ob = new Program(); выполните поиск гляньте. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 01:04 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Люто затроллил конечно. Сам все таки принимать участие не буду но за процессом посмотрю. ps. запустил на своей развалюхе core2duo 2.13/4Gb считала бы где то час а т и дольше. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 01:24 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Больше я ниасилил, до ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 01:52 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Больше я ниасилил, дошел до процесса, как на каринке вот что выдал профайлер. Может поможет часть оптимизировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 01:54 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Lord British, как получить такую картинку ? ))) Анализ->мастер производительности ? ткните пальцем. по теме. помимо банальной опптимизации , типа замены в том цыкле. Код: c# 1. 2. 3.
по копеечке , но придаст ускорение. есть вещи более тяжёлые. вот простенький код , который показывает стоимость вызова Код: 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.
DASM: //ПОСМОТРИМ НА СТОИМОСТЬ ВЫЗОВА CASTED_MASTRIX[NX].F[NY] = F_VALUE; 000000b7 mov eax,dword ptr [ebp-0Ch] 000000ba mov edx,dword ptr [ebp-8] 000000bd mov ecx,dword ptr [ebp-20h] 000000c0 cmp edx,dword ptr [ecx+4] 000000c3 jb 000000CA 000000c5 call 69F2A4C4 000000ca mov edx,dword ptr [ecx+edx*4+0Ch] 000000ce mov edx,dword ptr [edx+4] 000000d1 cmp eax,dword ptr [edx+4] 000000d4 jb 000000DB 000000d6 call 69F2A4C4 000000db fld dword ptr [ebp-10h] 000000de fstp dword ptr [edx+eax*4+8] MATRIX_2X2[NX, NY] = F_VALUE; 000000e2 mov eax,dword ptr [ebp-8] 000000e5 mov edx,dword ptr [ebp-0Ch] 000000e8 mov ecx,dword ptr [ebp-18h] 000000eb sub eax,dword ptr [ecx+10h] 000000ee cmp eax,dword ptr [ecx+8] 000000f1 jb 000000F8 000000f3 call 69F2A4C4 000000f8 sub edx,dword ptr [ecx+14h] 000000fb cmp edx,dword ptr [ecx+0Ch] 000000fe jb 00000105 00000100 call 69F2A4C4 00000105 imul eax,dword ptr [ecx+0Ch] 00000109 add eax,edx 0000010b fld dword ptr [ebp-10h] 0000010e fstp dword ptr [ecx+eax*4+18h] FLOAT_SIMPLE[NX] = F_VALUE; 00000112 mov eax,dword ptr [ebp-8] 00000115 mov edx,dword ptr [ebp-1Ch] 00000118 cmp eax,dword ptr [edx+4] 0000011b jb 00000122 0000011d call 69F2A4C4 00000122 fld dword ptr [ebp-10h] 00000125 fstp dword ptr [edx+eax*4+8] FLOAT_UNSAFE[NX] = F_VALUE; 00000129 mov eax,dword ptr [ebp-4] 0000012c mov edx,dword ptr [ebp-8] 0000012f fld dword ptr [ebp-10h] можно невооруженным глазом заметить, что стоит перейти на одномерные массивы, так скорость должна явно увеличиться. а используя неуправляемую память - ещё больше. //при взяти памяти напрямую, через getmem в c++, скорость тоже может раза в 2 подрасти , посравнению с массивом в шарпе. ваши дальнейшие действия зависят от того, насколько важна эта задача. т.е. скорость её выполнения ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 02:31 |
|
|
start [/forum/topic.php?fid=20&msg=38111827&tid=1405335]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
162ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 321ms |
total: | 595ms |
0 / 0 |