У меня алгоритм работает с массивом byte. По ходу работы программы значения в этом массиве претерпевают разные преобразования с использованием математических операторов (+,-,/,*) и битовых операторов (<, >, |, &, ^). Я так понимаю, что когда программа производит вычисления со значениями типа byte, то она всё время выполняет преобразование из byte в int и наоборот. Если принять во внимание, что расход памяти меня не слишком волнует, а вот производительность критична, не стоит ли мне в этом случае использовать массив int, даже не смотря на то, что будут использоваться только первые 8 бит этого типа?
Здравствуйте, Cynic, Вы писали:
C>Если принять во внимание, что расход памяти меня не слишком волнует, а вот производительность критична, не стоит ли мне в этом случае использовать массив int, даже не смотря на то, что будут использоваться только первые 8 бит этого типа?
А много данных? Расход памяти может и не волнует, а поместится ли весь массив в кэш — очень даже.
Преобразования одинаковые для каждого элемента? Может SSE?
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, Cynic, Вы писали:
C>>Если принять во внимание, что расход памяти меня не слишком волнует, а вот производительность критична, не стоит ли мне в этом случае использовать массив int, даже не смотря на то, что будут использоваться только первые 8 бит этого типа?
VF>А много данных? Расход памяти может и не волнует, а поместится ли весь массив в кэш — очень даже.
VF>Преобразования одинаковые для каждого элемента? Может SSE?
Ну массивы где то до 1 млн. элементов. Преобразования по большей части одинаковые, хотя есть и исключения. Ну и массивов таких может быть пару десятков.
Чё такое SSE?
Здравствуйте, Cynic, Вы писали:
C>Ну массивы где то до 1 млн. элементов. Преобразования по большей части одинаковые, хотя есть и исключения. Ну и массивов таких может быть пару десятков. C>Чё такое SSE?
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, Cynic, Вы писали:
C>>Ну массивы где то до 1 млн. элементов. Преобразования по большей части одинаковые, хотя есть и исключения. Ну и массивов таких может быть пару десятков. C>>Чё такое SSE?
VF>Streaming SIMD Extensions
Здравствуйте, Cynic, Вы писали:
C>Я так понимаю, что когда программа производит вычисления со значениями типа byte,
то она всё время выполняет преобразование из byte в int и наоборот.
Эээ, не уверен. Я думаю, что в случае с байтом будут сразу сгенерированы соотв. инструкции процессора.
Хотя могу и ошибаться. Но я бы сразу работал с байтом, т.к. меньше ручной возни с приведениями.
Здравствуйте, Cynic, Вы писали:
C>Я так понимаю, что вы имели ввиду, что работали бы с int? C>Я проверил производительность с byte и int. Оказалось, что int примерно на 3% быстрее.
Здравствуйте, Cynic, Вы писали:
C>когда программа производит вычисления со значениями типа byte, то она всё время выполняет преобразование из byte в int и наоборот.
Зависит от того, что вы делаете. В общем случае "преобразование" байта в инт это обнуление 2-байтового регистра и копирование байта в нижний (или наоборот, но с записью 0 в верхний), в другую сторону вообще преобразований нет (просто берется нижний байт результата).
Как уже много раз говорили, предварительная оптимизация — зло. Нужно иметь четкое представление о типах, чтобы не сделать банальных ошибок. А оптимизировать следует только тогда, когда в этом есть смысл.
Если возникают вопросы "что быстрее", то пишется простой тест и тестируются 2 (или больше) метода в цикле. В "общем случае" не важно, что вы используете (инт или байт), если результат верный; другой вопрос, используется ли наиболее оптимальный алгоритм. Т.к. кода нет, то и говорить как бы не о чем.