Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Вопрос: Разгоняем CHR : Почти в 2 раза!
Добавлено: 08.05.05 22:08
Автор вопроса: Morpheus | Web-сайт:
Ответы
Всего ответов: 125
Номер ответа: 61
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #61
Добавлено: 12.05.05 12:54
Ну а в плане скорости - даже ламеры знают что система шустрее всего работает с числами одной с ней разрядности. В больших пустых циклах даст выигрыш в несколько секунд
Почти так, только формулировка несовсем верная.
Быстрее всего процессор работает с теми числами, которые можно уместить в регистр. А длина регистра составляет 32 бита.
Номер ответа: 62
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #62
Добавлено: 12.05.05 13:09
Ну, под разрядностью системы я подразумевал аппаратную разрядность, а не разрядность ядра оси, так что формулировка верная. А вот насчет чисел, которые можно уместить в регистр - это и впрямь некорректно. В регистр помещаются 4 байта, 2 слова или двойное слово. И что, все эти типы одинаково работают? Можно еще вспомнить про тетрады - их уместится больше.
Номер ответа: 63
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #63
Добавлено: 12.05.05 13:20
Примечателен такой пример
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Form_Load()
Dim Ticks As Long
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Long
Dim e As Long
Dim f As Long
Ticks = GetTickCount
For a = 0 To 10000
For b = 0 To 1000
For c = 0 To 1000
Next c
Next b
Next a
Text1.Text = GetTickCount - Ticks
Ticks = GetTickCount
For d = 0 To 10000
For e = 0 To 1000
For f = 0 To 1000
Next f
Next e
Next d
Text2.Text = GetTickCount - Ticks
End Sub
Скорость у переменных long в данном случае примерно в 1,5 раза выше, однако интересно - в случае диапазона значений не от 0, а +- ситуация серьезно меняется...
Номер ответа: 64
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #64
Добавлено: 12.05.05 13:56
Ну, под разрядностью системы я подразумевал аппаратную разрядность, а не разрядность ядра оси, так что формулировка верная.
Сложно понять что ты подразумевал из того что ты написал.
А вот насчет чисел, которые можно уместить в регистр - это и впрямь некорректно. В регистр помещаются 4 байта, 2 слова или двойное слово. И что, все эти типы одинаково работают? Можно еще вспомнить про тетрады - их уместится больше.
Представь себе да
4 байта, 2 слова или двойное слово - все одинаково работают в регистре. Это всё одно и тоже
И что в словах "Быстрее всего процессор работает с теми числами, которые можно уместить в регистр." некорректоного. Не мог бы ты пояснить?
Тетрады можно уместить в регистре, но от этого длина его не изменится, всё равно в нём будет Long.
Быстрее всего процессор работает с 8 и 32 разрядными числами потому что их можно поместить в регистр. Однако при сложных алгоритмах регистров оказывается недостаточно и те переменные, которым не хватило места в регистре, считываются из памяти. Здесь уже играет роль алгоритм. Чем эффективней ты напишешь алгоритм, тем реже будет обращение к памяти и соответсвенно быстрее скорость работы непустого цикла.
Номер ответа: 65
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #65
Добавлено: 12.05.05 14:24
Всё равно, 1, 2 или 4 байта. Скорость зависит не от размера операнда. Скорость зависит от того, насколько выравнены адреса операндов (переменных) в памяти по границе, кратной 4. В случае с long (dword) обеспечить оптимальный align удаётся в большинстве случаев, не предпринимая специальных мер, т.к. его размер уже кратен 4. Поэтому доступ к ним быстрее, чем к адресам, некратным 4-м (для byte и word/integer).
Но это можно обойти и сравнять скорость для всех трех типов, правда за счет некоторого неудобства. И к тому же не на VB (он не позволяет манипулировать адресами переменных)
Добиться для byte и word такой же скорости, как и для long(dword) можно указывая align 4 перед каждой переменной, т.е. адреса всех переменных будут кратны 4 за счёт пустых мест между ними. Но это не очень удобно, да и сделать можно только на ассемблере, поэтому по возможности лучше заменить byte/integer на long.
Номер ответа: 66
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #66
Добавлено: 12.05.05 14:35
2CyRax: Посмотрел на твою запись обозначения килобайт - и вспомнил, что заглавной буквой "Б" у нас обозначаются белы, логарифмические единицы измерения звукового давления. Байты обозначаются строчной буквой "б". А указанные тобой 4 килобела равняются 40000 дБ... 8О Да, от такого взрыва всю планету нафиг разнесет на кусочки...
Номер ответа: 67
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #67
Добавлено: 12.05.05 14:37
Неужели так уж и сложно?
4 байта, 2 слова или двойное слово - все одинаково работают в регистре. Это всё одно и тоже
Разумеется я знаю что это одно и то же. Я тебе говорю про сами типы данных. То есть байт, слово, двойное слово. Двойное слово на 32-разрядных системах работает быстрее чем 16 или 8 разрядные числа.
Про некорректность - я поясню. Если процессор получает 32-разрядное значение, то работает с 32-разрядным. Если 8 - то с восемью. Они оба помещаются. Но хотя Byte тоже помещается в регистр - он работает медленнее чем Long. Про большие переменные мы не говорим, там тема другая.
Номер ответа: 68
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #68
Добавлено: 12.05.05 14:45
Скорость зависит не от размера операнда. Скорость зависит от того, насколько выравнены адреса операндов (переменных) в памяти по границе, кратной 4.
Всё же это не отменяет того что память в любом случае медленней регистра и для наибольшего быстродействия лучше минимизоровать обращение к ней в цикле.
Скорость зависит не от размера операнда. Скорость зависит от того, насколько выравнены адреса операндов (переменных) в памяти по границе, кратной 4.
Ну а если размер операнда 1 байт (например CMPSB), зачем тогда 4-х байтоное выравнивание?
Номер ответа: 69
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #69
Добавлено: 12.05.05 15:02
Про некорректность - я поясню. Если процессор получает 32-разрядное значение, то работает с 32-разрядным. Если 8 - то с восемью. Они оба помещаются. Но хотя Byte тоже помещается в регистр - он работает медленнее чем Long. Про большие переменные мы не говорим, там тема другая.
Byte и Long работают с одинаковой скоростью в процессоре (если конечно у них одинаковый тип операнда). Integer по идее тоже должен, но т.к. для 32-битного режима процессора это нестандартный размер операнда (требует префикса), то не стану этого утверждать.
Номер ответа: 70
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #70
Добавлено: 12.05.05 15:02
Про некорректность - я поясню. Если процессор получает 32-разрядное значение, то работает с 32-разрядным. Если 8 - то с восемью. Они оба помещаются. Но хотя Byte тоже помещается в регистр - он работает медленнее чем Long. Про большие переменные мы не говорим, там тема другая.
Byte и Long работают с одинаковой скоростью в процессоре (если конечно у них одинаковый тип операнда). Integer по идее тоже должен, но т.к. для 32-битного режима процессора это нестандартный размер операнда (требует префикса), то не стану этого утверждать.
Номер ответа: 71
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #71
Добавлено: 12.05.05 15:03
Оптимизация обращения - есть выравнивание операндов (для VB - long).
байтоное выравнивание - для оптимизации скорости. Для 32 разрядных значений (если их адрес выровнян по 4) считывание происходит за одну операцию. Для 8-битных используется т.н. "Byte Enable" line. Поскольку байт может располагаться в произвольном месте памяти и, соответственно, по шине он может быть не младшим разрядом, процессор должен еще привести его к младшему разряду (т.е. чтобы он был 255, а не 65535 и т.п.).
Номер ответа: 72
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #72
Добавлено: 12.05.05 15:05
Я и не говорю что Byte медленнее работает в процессоре. Я говорю что Byte медленнее работает.
Номер ответа: 73
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #73
Добавлено: 12.05.05 15:06
Да, и насчет 65535 - я конечно погорячился. В лучшем случае - 65280 или значительно выше
Номер ответа: 74
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #74
Добавлено: 12.05.05 15:09
Операнд-Регистр имеет свои подтипы. Это r8, r16 и r32. На скорость выполнения это никак не влияет, разве что на скорость загрузки команды в ковеер при работе с imm. Опкоды для каждого типа операнда разные, либо разные биты поля MOD R/M при одинаковых опкодах. Регистр - это участок памяти внутри процессора. И не имеет значения к какой его части ты обращаешся.
Номер ответа: 75
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #75
Добавлено: 12.05.05 15:15
байтоное выравнивание - для оптимизации скорости. Для 32 разрядных значений (если их адрес выровнян по 4) считывание происходит за одну операцию. Для 8-битных используется т.н. "Byte Enable" line. Поскольку байт может располагаться в произвольном месте памяти и, соответственно, по шине он может быть не младшим разрядом, процессор должен еще привести его к младшему разряду (т.е. чтобы он был 255, а не 65535 и т.п.).
Да, но это верно только для старых процессоров. Сейчас это уже не актуально. Ну и потом, всё равно в Window все адреса виртуальные (реальный линейный адрес лежит в сегментных регистрах). И выравнивание в виртуальном адресе не будет иметь никакого эффекта в реальном.