Вопрос по С++

Шальная

консультант
Кто то может нормально написаную прогу на Паскаль перевести на язык С ????
 

liko

Member
Всем доброго времени суток!
Помогите оптимизировать код. Требуется минимальное время выполнения кода в цикле?

do /* реализация цикла чтения счетчика и подсчета тактов */
{
/* Запись в РУС команды защелкнуть данные счета */
outportb(0x43,0x00);

/* читаем значение LSB/MSB счетчика */
clk = ((inportb(0x40))) + (inportb(0x40)<<8);

/* суммируем число импульсов счетчика */
if (clk <= clk_1) clk_sum = clk_sum + (clk_1 - clk);
else clk_sum = clk_sum + clk_1 + (0xFFFF - clk);

clk_1 = clk; /* сохраняем текущее значение счетчика */

} while( clk_sum < clk_end );
 
Останнє редагування:

dreamer

Member
Всем доброго времени суток!
Помогите оптимизировать код. Требуется минимальное время выполнения кода в цикле
Врядли тут тебе кто поможет, цикл небольшой и простой, оптимизировать тут просто нечего да и выиграешь ты немного. Если что и можно сделать то только в логике программы вокруг этого цикла.
Я могу предложить тут только заменить
Код:
clk = ((inportb(0x40))) + (inportb(0x40)<<8);
на
clk = ((inportb(0x40))) | (inportb(0x40)<<8);
но большого выигрыша не будет.
 

quant

yeah
Відповідь: Вопрос по С++

не знаю как оптимизировать вродь всё норм, напишу как уменьшить количество букавок
нащёт здвигов это класно, но компилеры сейчас сообразительные и сами сделают как лучше, так что со здвигами не стоит
Код:
clk = ((inportb(0x40))) + (inportb(0x40)<<8);
можно заменить на
Код:
clk = inportb(0x40) * 0x101;
а
Код:
if (clk <= clk_1) clk_sum = clk_sum + (clk_1 - clk);
else clk_sum = clk_sum + clk_1 + (0xFFFF - clk);
можно записать короче
Код:
clk_sum += clk <= clk_1 ? clk_1 - clk : clk_1 + 0xFFFF - clk;
 

dreamer

Member
Re: Відповідь: Вопрос по С++

Код:
clk = ((inportb(0x40))) + (inportb(0x40)<<8);
можно заменить на
Код:
clk = inportb(0x40) * 0x101;
Насколько я могу судить inportb это функция, которая возвращает каждый раз следующий байт из порта, так что тут надо два вызова.
И вообще говоря тут нельзя писать даже
Код:
clk = ((inportb(0x40))) + (inportb(0x40)<<8);
Поскольку тут важен порядок вызова а он в С++ неопределен, так что нельзя предсказать результат, он зависит от компилятора. Лучше так
Код:
clk = inportb(0x40);
clk |= inportb(0x40) << 8;
 

liko

Member
Всем откликнувшимся спасибо!

Насчет логического сложения вместо арифметического, это дело, если для IBM совместимой на время выполнения может и не сильно повлияет, то для МК это будет выход из положения. Всеравно попробую.

Строку
Код:
 clk = ((inportb(0x40))) + (inportb(0x40)<<8);
Менят на
Код:
clk = inportb(0x40) * 0x101;
нельзя, я забыл предупредить что нужно читать вначале младший байт, затем старший.
Склоняюсь все же записать:

Код:
clk = inportb(0x40);
clk |= inportb(0x40) << 8;
это будет действительно, правильно.
Ну а на счет

Код:
clk_sum += clk <= clk_1 ? clk_1 - clk : clk_1 + 0xFFFF - clk;
нужно подумать, а точнее попробовать (пишу на Borland C++ v3.1 под DOS).
 
Зверху