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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2013, 22:49   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Мне кажется, виноват не компилятор, а среда разработки (имхо).
Использую Code::Blocks (с MinGW) - по-моему, работает с long double.

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

Вывод 1000000 чисел еще не означает необходимость их хранения (ну это конечно же зависит от задачи). Может быть, Вы приведете саму задачу?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 09.02.2013 в 22:52.
BDA вне форума Ответить с цитированием
Старый 09.02.2013, 23:19   #12
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Практика показала, что 500000 чисел Паскаль выводит за 2 минуты 12 секунд (померено не секундомером, а мной же написанным таймером)
Не file of ... случаем? Если так, то они не буферизуются, попробуй просто file, без типа.
Somebody вне форума Ответить с цитированием
Старый 10.02.2013, 11:28   #13
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Metaluk Посмотреть сообщение
Практика показала, что 500000 чисел Паскаль выводит за 2 минуты 12 секунд (померено не секундомером, а мной же написанным таймером), в то время как на Си выводится гораздо быстрее (примерно секунд 20, даже скорей всего меньше), поэтому рентабельней все же переписать программу на Си.
Вывод неверный.
Нет, на первый взгляд, логика в таком подходе присутствует. Но на практике разницы между компиляторами более чем в 6 раз нет. Т.е. в данном случае разница связана не с степенью оптимизации алгоритма, а с различиями в реализации самого алгоритма.
Гадать, где именно в Вашем коде скрывается проблема, конечно, дело малоперспективное, но запросто может оказаться, что она там, где Вы ее совсем не ждете.
Например, при переборе элементов двумерного массива скорость обработки может изменяться более чем в 10 раз просто от изменения порядка перебора индексов (сначала по i, потом по j или наоборот).
Цитата:
Поэтому меня волнует именно проблема связанная с вылетающей ошибкой при введении массива в 1000000. Какие-нибудь предложения по ее устранению есть?
Предложение совершенно стандартное - вместо статического использовать динамический массив.
Цитата:
Я думаю, что нужно поменять компилятор, так как этот даже не воспринимает вычисления с числами типа long double, несмотря на все усилия.
А каким компилятором Паскаля Вы пользуетесь?

PS. 2 минуты на вывод миллиона чисел - это ОЧЕНЬ много. Что-то у Вас не так с алгоритмом.

Последний раз редактировалось s-andriano; 10.02.2013 в 11:30.
s-andriano вне форума Ответить с цитированием
Старый 10.02.2013, 16:08   #14
Metaluk
Пользователь
 
Регистрация: 06.02.2013
Сообщений: 21
По умолчанию

Компилятор для Паскаля fpc 2.4.0.

Алгоритм моей собственной задачи не имеет абсолютно никакого значения при подсчете времени. Просто когда моя программа не прошла тесты по причине превышения лимита времени, я подумал измерить время вывода данного количества чисел на Паскале, оказалось очень большим. Посмотрел время вывода этого же количества чисел на Си, оказалось гораздо меньше. Переписал свою программу на Си. Оказалось, что время работы действительно сократилось, причем довольно значительно.

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

Последний раз редактировалось Metaluk; 10.02.2013 в 16:19.
Metaluk вне форума Ответить с цитированием
Старый 11.02.2013, 07:53   #15
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Если у Вас время вывода различается в несколько раз, значит, дело не в оптимизаторе, а в чем-то гораздо более существенном.

Сейчас проверил:
форматный вывод 1000000 чисел по 1 числу на строке - 12 с,
бесформатный вывод 1000000 чисел по одному числу за раз - 5.8 с.
бесформатный вывод массива длиной 1000000 чисел за раз - 0.05 с.

Это при том, что провекрка была на процессоре Atom (!).
Уверен, что Вы проверяли на существенно более мощном процессоре.
s-andriano вне форума Ответить с цитированием
Старый 11.02.2013, 10:29   #16
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Мне кажется, виноват не компилятор, а среда разработки (имхо).
в том, что программа падает виновата среда разработки? - Как это возможно?
rrrFer вне форума Ответить с цитированием
Старый 11.02.2013, 11:05   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

чтоб сравнить надо смотреть код который у вас и там и там.

если в паскале вы применили просто array of, то это дин массив и он не в стеке потому и работает все.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.02.2013, 11:59   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
в том, что программа падает виновата среда разработки? - Как это возможно?
Если ТС утверждает, что не получается работать с long double, при этом, в другой среде разработки с тем же компилятором все работает, то можно предположить

Не хочу спорить (могу быть не прав).
Это же просто предположение
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.02.2013, 16:01   #19
Metaluk
Пользователь
 
Регистрация: 06.02.2013
Сообщений: 21
По умолчанию

Для s-andriano:
Процессор - Intel Celeron D, частота 3.33 ГГц, ОЗУ - 512 Мб.
Используемый компилятор - fpc 2.4.0. Среда разработки - Geany.

Теперь приведу 2 практически идентичные программы вывода на экран 500000 чисел
Код:
uses crt, dos;
var i: longint;
    mas: array [1..500000] of longint;
    
var hour_start, min_start, sec_start, hund_start,
    hour_stop, min_stop, sec_stop, hund_stop,
    hour, min, sec, hund: word;
procedure get_time_start;
begin 
GetTime(hour_start, min_start, sec_start, hund_start);
end;
procedure get_time_stop;
begin
GetTime(hour_stop, min_stop, sec_stop, hund_stop);
end;
procedure time;
begin
if hour_stop<hour_start then hour_stop := hour_stop+24;
if hund_stop<hund_start then 
   begin hund_stop := hund_stop+100;
         sec_stop := sec_stop-1;
   end;
hund := hund_stop-hund_start;
if sec_stop<sec_start then
   begin min_stop := min_stop-1;
         sec_stop := sec_stop+60;
   end;
sec := sec_stop-sec_start;
if min_stop<min_start then 
   begin hour_stop := hour_stop-1;
         min_stop := min_stop+60;
   end;
min := min_stop-min_start;
hour := hour_stop-hour_start;
end;
procedure Vivod;
begin
write('Nachalo raboty:');
writeln(hour_start, ':', min_start, ':', sec_start, ':', hund_start);
write('Oconchanie raboty');
writeln(hour_stop,':', min_stop, ':', sec_stop, ':', hund_stop);
writeln(hour, ':', min, ':', sec, ':', hund);
end;

begin
get_time_start;
for i := 1 to 500000 do
 begin
    {mas[i] := i;}
    writeln(i);
 end;
get_time_stop;
time;
vivod;
end.
Второй код будет отличаться только тем, что изначально заполняется массив и тут же выводятся числа:
Код:
begin
get_time_start;
for i := 1 to 500000 do
 begin
    mas[i] := i;
    writeln(mas[i]);
 end;
get_time_stop;
time;
vivod;
end.
В каждую из этих программ вставлены процедуры для таймера, поэтому такой большой код.

Я провел несколько экспериментов по измерению времени вывода чисел.
Выкладываю принтскрины экрана после работы программы.
Для первой программы:
1. http://uploads.ru/SGtQU.jpg
2. http://uploads.ru/TeoOS.jpg
3. http://uploads.ru/MwoxU.jpg
4. http://uploads.ru/UoaKh.jpg
5. http://uploads.ru/EqNxP.jpg
Для второй программы:
1. http://uploads.ru/8HZFo.jpg
2. http://uploads.ru/2GZyB.jpg
3. http://uploads.ru/feQBp.jpg
4. http://uploads.ru/aOJG4.jpg
5. http://uploads.ru/jxQAf.jpg

Последний раз редактировалось Metaluk; 11.02.2013 в 16:18.
Metaluk вне форума Ответить с цитированием
Старый 11.02.2013, 16:06   #20
Metaluk
Пользователь
 
Регистрация: 06.02.2013
Сообщений: 21
По умолчанию

Протестировал так же для программы, в которой вообще массив не вводил. Время такое же примерно.
Metaluk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос про обращение серверного языка веб-программирования Амелия Паскаль, Turbo Pascal, PascalABC.NET 0 03.06.2012 12:18
And once again. Вопрос общего характера по выбору языка программирования. eepive Помощь студентам 6 13.05.2011 10:37
много материалов по компиляторам, трансляторам, транслитераторам, лексическим анализаторам и т.п. Marsel737 Свободное общение 1 03.09.2010 17:58
тест по Операционным системам,средам и оболочкам guns'ik Помощь студентам 0 26.04.2010 19:13
Вопрос по языкам программирования mixer94 Помощь студентам 4 08.06.2009 12:22