Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2009, 23:09   #41
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Немного переделал и упростил.

Чтобы лучше разобраться с потоками почитай вот это:
http://www.interface.ru/home.asp?artId=6105

Непосредственно о семафорах:
http://frolov-lib.ru/books/bsp/v26/ch4_6.htm
http://trubetskoy1.narod.ru/art/synch/semaphore.html
Вложения
Тип файла: rar SolveVeryLongNumber_v2.0.rar (178.8 Кб, 28 просмотров)
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 07.07.2009, 13:37   #42
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Уважаемый Daramant я посмотрел Вашу программу, с кодом до конца не разобрался, но обязательно разберусь, спасибо за помощь. У меня есть пара замечаний ну или как это назвать. Короче я создал файл, того типа, который нужен для загрузки данных в Вашу программу(в файл записал результат достигнутый на моей программе это число в 28795000 степени с количеством цифер 8668160), и загрузил его, Ваша программа после начала обработки не подает ни каких признаков жизни, висит намертво. Даже в логах чисто. И что я еще заметил, она загружает ТОЛЬКО 50% ЦП. Да и еще про оперативную память, на таком числе Ваша программа занимает уже 50 МБ памяти, а моя постоянно 14,5 МБ. Это же получается что по всем показателям Ваша программа затратнее.
Про потоки, по ссылкам которые Вы дали, я еще не читал, но почитаю.

Последний раз редактировалось Iong; 07.07.2009 в 13:41.
Iong вне форума Ответить с цитированием
Старый 07.07.2009, 15:12   #43
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
я создал файл, того типа, который нужен для загрузки данных
Может ты с форматом где ошибся. Выложи файл, я посмотрю, так трудно что-то сказать.

Цитата:
она загружает ТОЛЬКО 50% ЦП
Видимо система назначает эти потоки на один процессор.
Попробуй назначить потоки на разные процессоры, для этого:
в модуле uSolver в самом низу в разделе initialization после кода создания потоков:
Код:
  LowPartSolverThread := CreateThread(0, 0, @LowPartSolverThreadProc, 0, CREATE_NEW, tid);
  HighPartSolverThread := CreateThread(0, 0, @HighPartSolverThreadProc, 0, CREATE_NEW, tid);
вставть следующий код:
Код:
  SetThreadIdealProcessor(LowPartSolverThread, 0); // 1-й поток на 1-й процессор
  SetThreadIdealProcessor(HighPartSolverThread, 1); // 2-й поток на 2-й процессор
Цитата:
на таком числе Ваша программа занимает уже 50 МБ памяти, а моя постоянно 14,5 МБ
Закоментируй вывод в mmLog на 220 строке.
Цитата:
frmMain.mmLog.Lines.Add(...);
frmMain.Refresh;
Код:
if (CurPower mod 500 = 0) or Suspended then
Можно реже записывать промежуточные результаты в файл. (вместо 500 напиши что-нибудь побольше)

Память выделяется при создании строк в которые преобразуется массив, в функции GetArrayAsString().
Это функция вызывается при записи в mmLog и сохранении/загрузке из файла.

P.S. Если размер используемой памяти критичен, можно переписать функции сохранения/загрузки данных из файла.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 07.07.2009 в 15:30.
Daramant вне форума Ответить с цитированием
Старый 07.07.2009, 16:43   #44
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Цитата:
Может ты с форматом где ошибся. Выложи файл, я посмотрю, так трудно что-то сказать.
сделал число поменьше, файл с числом выложил. на нем тоже зверски виснет.
С оперативной памятью проблем пока нет, да думаю и не будет, а то что 50 МБ занимает, это я так просто подметил этот факт. Еще одно замечание, Кнопка "Suspend" не работает при обработки большого числа.
Цитата:
SetThreadIdealProcessor(LowPartSolv erThread, 0); // 1-й поток на 1-й процессор
SetThreadIdealProcessor(HighPartSol verThread, 1); // 2-й поток на 2-й процессор
Вставил этот код как Вы и сказали, эффект есть, загрузка ЦП 100%.
Закомментировал вывод в mmLog на 220 строке, в производительности прирост заметен.
Сравнил по скорости обработки Вашу и мою программы, моя жрет 50% ЦП а дает такую же скорость обработки. Это не рационально:-( должна быть разница в скорости как минимум на 30-40%
Вложения
Тип файла: rar data_1410000.rar (195.5 Кб, 12 просмотров)
Iong вне форума Ответить с цитированием
Старый 07.07.2009, 18:01   #45
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Подвисало от:
Код:
frmMain.mmLog.Lines.Add(...);
frmMain.Refresh;
т.е. при выводе на экран большого числа.
Также закомментируй тело процедуры ShowResults;
Это увеличит производительность и не будет подвисать.
И в 224 строке убери условие
Цитата:
if CurPower mod 100 = 0 then
,
т.е. оставь только Application.ProcessMessages; тогда форма подвисать не будет.

Также можно заменить:
Код:
  
  d := mArray[i] div 10;
  mArray[i] := mArray[i] mod 10;
на:
Код:
 
  d := 1;
  mArray[i] := mArray[i] - 10;
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 07.07.2009, 23:04   #46
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Я немного оптимизировал алгоритм, по тестируй его, должен работать быстрее.
Вложения
Тип файла: rar SolveVeryLongNumber v0.5.rar (12.7 Кб, 21 просмотров)
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код игры на Паскале и на Делфи сильно отличается? Как переписать код с Паскаля в Делфи? Mclaren Помощь студентам 2 27.04.2009 22:37
готовое приложение ComeToDaddy Помощь студентам 17 03.04.2009 18:25
консольное приложение user_jasser Общие вопросы Delphi 3 17.10.2008 12:17
Консольное приложение a_priori Общие вопросы Delphi 6 12.03.2008 08:33
Пароль на приложение Chals Общие вопросы Delphi 6 24.11.2007 21:32