Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.

what's his name? (his name is Linux. The future is open)

Тема в разделе "Hi Tech", создана пользователем Xitpij_Laban, 15 сен 2003.

  1. Dmitry Pankratov

    Dmitry Pankratov Аксакал

    По первой задаче решение с case получается не самым быстрым (в принципе :) )
    По второй - то же самое. Выборка из массива из 32 элементов. Одна операция - максимальное быстродействие. Все остальное - менее эффективно.



    <!--EDIT|Dmitry Pankratov|1063795194-->
     
  2. Alexey

    Alexey Аксакал

    А на память нам наплевать?
    Вы забыли кое что учесть: Процессор впустую пропустит множество тактов просто ожидая подгрузки следующих комманд из основной памяти в регистры.
    Так что эта программа далеко не оптимальна.
     
  3. Stas

    Stas Аксакал

    Да! Как я уже писал память давно уже не проблема.

    Назовите любой современный процессор не имеющий конвеера и предварительной выборки команд :)


    Предложите лучше!
     
  4. Alexey

    Alexey Аксакал

    Вы знакомы с работой конвейра?
    Он не может заоптимизировать работу case.
    Ваша прога не может поместиться в регистрах проца. Проц будет вынужден обращаться к основной памяти много раз тратя впустую уюму тактов.

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

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



    <!--EDIT|Alexey|1063800064-->
     
  5. Dmitry Pankratov

    Dmitry Pankratov Аксакал

    Ногами не пинать... :)
    Более-менее оптимальное решение (если действительно нужно минимальное количество команд при сравнительно небольших затратах памяти) укладывается в 9 назовем их так - условных команд процессора, и предварительно заполненного массива из 256 байт.
    1. count = 0
    2. nextbyte = mask[0]
    3. count += numbits_array[nextbyte]
    ...
    8. nextbyte = mask[3]
    9. count += numbits_array[nextbyte]

    На интеловском процессоре есть команда bsf - bits scan forward. Для сетевой маски этот алгоритм можно сделать одной этой командой :)

    P.S. Мне это напомнило старые добрые времена 386-х, когда код оптимизировался вручную...было же время, блин... :)



    <!--EDIT|Dmitry Pankratov|1063801463-->
     
  6. Stas

    Stas Аксакал

    Дык и задача как раз из тех времен.  :)  :)

    Увы, но с ростом колличества девелоперов ремесленников и тулзов для них типа С# реальное умение програмировать уходит в прошлое. Если человек ни разу в жизни не писал на ассемблере это сразу видно.

    Кстати те времена еще не совсем прошли (спасибо open source). В ядре Linux для для большинства архитектур такие вещи на асемблере писаны. Для IA32 к примеру используется упомянутая вами bsfl  :) BTW архитектура IA64 этой замечательной командочки лишилась  :eek:verdoze: Общий случай решения проблемы на самом простом ассемблере - цикличиский сдвиг регистра через признак С со счетчиком.

    Подозреваю в Дмитрии Панкратове бывшего системщика  :hehe: - "ремесленики" таких тонкостей ассемблера не знают.

    А вот от Алексея мы ничего, кроме умничания так и не услышали  :(
     

Поделиться этой страницей

Загрузка...