Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 686
от 03.10.2008, 02:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 216, Экспертов: 37
В номере:Вопросов: 3, Ответов: 5

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 145174: Здравствуйте, уважаемые эксперты! Подскажите пожалуйста, можно ли на основе побитовых операторов получить выигрыш в скорости, а то на операторах mod, div, odd теряется слишком много времени. Вот предполагаемые варианты программ: var mas:a...
Вопрос № 145225: здравствуйте,уважаемые эксперты... помогите ,пожалуйста,решить вот эти задачи... 1)Составить программу,которая находит наибольшее значение отношения трехзначного числа к сумме его цифр. 2)Написать программу,которая вычисляет наибольший общий...
Вопрос № 145236: Спасибо за предыдущие задачи... помогите решить еще одну,пожалуйста. Написать программу,которая проверяет является ли целое число,введенное пользователем,простым. Заранее спасибо......

Вопр ос № 145.174
Здравствуйте, уважаемые эксперты!
Подскажите пожалуйста, можно ли на основе побитовых операторов получить выигрыш в скорости, а то на операторах mod, div, odd теряется слишком много времени.
Вот предполагаемые варианты программ:
var
mas:array[1..8,1..8]of {с типом тоже надо определиться};
{варианты типа - boolean, char, shortint}

1 программа)
for i:=1 to 8 do
for j:=1 to 8 do
mas[i,j]:={...};

2 программа)
for i:=1 to 64 do
begin
x:=((i-1)div 8)+1;
y:=((i-1)mod 8)+1;
z:=odd(i); {необходима в дальнейшем. ИМХО тот текст прогрммы не ускорим}
mas[x,y]:={...};
end;

В дальнейшем используются проверки (первая программа), в зависимости от типа:
if (i in [1..8])and(j in [1..8])and (mas[i,j] или mas[i,j]=' ' или mas[i,j]=0) then {...}


ВОПРОСЫ:
1) Можно ли на основе побитовых операторов получить переменные x,y,z (во второй прогрмме), чтобы она работала быстрее первой про граммы и как это сделать?
2) Какой тип лучше использовать для ускорения вычисления условия?
3) Как более быстро осуществлять определение вхождение числа в диапазон?
варианты
i in [1..8]
i>0 and i<9
I>0 или i<9 при условии, что перед сравнением i соответственно уменьшилось или увеличилось, но тогда вопрос 3,1.
3.1) Можно ли на основе побитовых операторов добиться ускорения (см. вопрос 3) и как это сделать?

4) Какие операторы работают быстрее?
варианты
1а) i:=i+1, i:=i-1;
1б) inc(i), dec(i)
1в) i:=succ(i), i:=pred(i)
2а) i:=i+N, i:=i-N;
2б) inc(i,N), dec(i,N)

ЗАРАНЕЕ СПАСИБО!
Отправлен: 27.09.2008, 10:40
Вопрос задал: Тепляков Константин Владимирович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Denisss

Здравствуйте, Тепляков Константин Владимирович!

Первая программа после компиляции будет выглядеть примерно так:
Код:
for1:
i:= 1;
for2:
j:= 1;
mas[i,j]:={...};
inc(j);
if (j <> 9) then goto for2;
inc(i);
if (i <> 9) then goto for1;

Вторая программа c использованием побитовых операций будет выглядеть так:
Код:
for:
i:= 0
x:= i;
x:= x shr 3; {x:= x div 8}
Inc(x);
y:= i;
y:= y and 7; {y:= y mod 8}
Inc(y);
z:= i;
z:= z and 1; {z:= Odd(i+1)}
mas[x,y]:={...}
Inc(i);
if (i <> 64) goto for;

Что здесь наблюдается? Вторая программа выглядит явно менее привлекательной и, могу гарантировать, будет работать немного медленнее первой за счет наличия дополнительных операций.

Производительность (i in [1..8]) и ((i > 0) and (i < 9)) решил выполнить с помощью цикла. Время выполнения вычислял с помощью функции GetTime (находится в модуле Dos).
Вывод такой:
1 миллиард сравнений (тип Longint)
- (i in [1..8]) выполнен за 9.12 секунд;
- ((i > 0) and (i < 9)) выполнен за 9.84 секунд.
Т.е. в моем случае вторая конструкция работает на 7% медленнее. Если за 1 млрд. итераций теряется всего лишь 700 миллисекунд, то для, допустим, 1 млн. это уже меньше одной миллисекунды. Так что, по моему мнению, можно выбирать любую из этих двух конструкций на Ваш вкус, потеря производительности будет ничтожно мала.

Насчет последнего пункта В ашего вопроса. Дизассемблировав полученную после компиляции программу, сделал выводы, что компилятор делает определенную оптимизацию.

Варианты 1а), 1б) и 1в) выглядят абсолютно одинаково:
inc eax
и
dec eax

Варианты 2а) и 2б) тоже идентичны:
add eax, N
и
sub eax, N

Так что можете использовать любую удобную конструкцию (мне больше по душе Inc - наглядный и не нужно думать насчет наличия оптимизации кода в компиляторе).

Успехов!
---------
Все должно быть сделано настолько просто, насколько это возможно. Но не проще. (с) А.Эйнштейн
Ответ отправил: Denisss (статус: Профессор)
Россия, Москва
ICQ: 281599577
----
Ответ отправлен: 30.09.2008, 15:20
Оценка за ответ: 5
Комментарий оценки:
По-моему ответ достойный текущего статуса (на данный момент профессора). Из данного ответа узнал новые способы организации циклов (использую FOR). Под кое-какие моменты еще придется мне подстраиваться, но это уже недостатки самого вопроса, а не ответа, так что однозначно 5.


Вопрос № 145.225
здравствуйте,уважаемые эксперты...
помогите ,пожалуйста,решить вот эти задачи...
1)Составить программу,которая находит наибольшее значение отношения трехзначного числа к сумме его цифр.
2)Написать программу,которая вычисляет наибольший общий делитель двух целых чисел

помогите,пожалуйста...
заранее вам спасибо...
Отправлен: 27.09.2008, 20:32
Вопрос задала: Заболотских Татьяна Сергеевна (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Шичко Игорь
Здравствуйте, Заболотских Татьяна Сергеевна!
Предлагаю вариант решения задач в Delphi
Код в приложении
Переменные:
i - счетчик
a, b - вводимые числа для второй задачи
del - максимаольный делитель для второй задачи
min - минимальное число из введенных
temp - временная переменная
max_del - наибольшее отношение для первой задачи

Приложение:

Ответ отправил: Шичко Игорь (статус: 6-ой класс)
Ответ отправлен: 27.09.2008, 21:40
Оценка за ответ: 5
Комментарий оценки:
спасибо большое...вы мне очень,очень сильно помогли...

Отвечает: Denisss

Здравствуйте, Заболотских Татьяна Сергеевна!

В приложении находятся примеры задач.

В первой задаче получается отношение 100. В общем, это и так понятно. Сами судите, для чисел 100, 200, 300, ..., 900 отношение равно 100. Далее любые отношения меньше в несколько раз (101/2=50.5; 201/3=67; 301/4=75.5; ...; 901/10=90.1).

Во второй задаче применен алгоритм Евклида
Реализации алгоритма для разных языков программирования можно найти здесь: Примеры реализации алгоритма Евклида

Удачи!

Приложение:

---------
Все должно быть сделано настолько просто, насколько это возможно. Но не проще. (с) А.Эйнштейн

Ответ отправил: Denisss (статус: Профессор)
Россия, Москва
ICQ: 281599577
----
Ответ отправлен: 27.09.2008, 21:49
Оценка за ответ: 5
Комментарий оценки:
спасибо большое!!!! вы мне очень помогли....теперь буду знать к кому обращаться.....спасибо еще раз...


Вопрос № 145.236
Спасибо за предыдущие задачи...
помогите решить еще одну,пожалуйста.
Написать программу,которая проверяет является ли целое число,введенное пользователем,простым.

Заранее спасибо...
Отправлен: 27.09.2008, 22:13
Вопрос задала: Заболотских Татьяна Сергеевна (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: -=Dr. Штопор=-
Здравствуйте, Заболотских Татьяна Сергеевна!
Программа в приложении.

Приложение:

---------
Tantum possumus, quantum scimus

Ответ отправил: -=Dr. Штопор=- (статус: Студент)
Ответ отправлен: 27.09.2008, 22:37

Отвечает: Denisss

Здравствуйте, Заболотских Татьяна Сергеевна!

В приложении находится пример. Функция isSimple(Integer) возвращает True, если число простое и False в ином случае.
Список первых 500 простых чисел для проверки примера можно найти здесь: Список простых чисел

Удачи!

Приложение:

---------
Все должно быть сделано настолько просто, насколько это возможно. Но не проще. (с) А.Эйнштейн

Ответ отправил: Denisss (статус: Профессор)
Россия, Москва
ICQ: 281599577
----
Ответ отправлен: 27.09.2008, 22:42


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.3 RC 2 от 09.09.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное