Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

 

  Вопрос: Разгоняем CHR : Почти в 2 раза! Добавлено: 08.05.05 22:08  

Автор вопроса:  Morpheus | Web-сайт: xury.zx6.ru

Ответить

  Ответы Всего ответов: 125  

Номер ответа: 61
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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
Сделал сначала стандартный (в моём случае) снимок в 1024 байта, затем 4 кБ...

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-сайт: basicproduction.nm.ru
 Профиль | | #68
Добавлено: 12.05.05 14:45

Скорость зависит не от размера операнда. Скорость зависит от того, насколько выравнены адреса операндов (переменных) в памяти по границе, кратной 4.

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


Скорость зависит не от размера операнда. Скорость зависит от того, насколько выравнены адреса операндов (переменных) в памяти по границе, кратной 4.

 Ну а если размер операнда 1 байт (например CMPSB), зачем тогда 4-х байтоное выравнивание?

Ответить

Номер ответа: 69
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #69
Добавлено: 12.05.05 15:02

Про некорректность - я поясню. Если процессор получает 32-разрядное значение, то работает с 32-разрядным. Если 8 - то с восемью. Они оба помещаются. Но хотя Byte тоже помещается в регистр - он работает медленнее чем Long. Про большие переменные мы не говорим, там тема другая.

 Byte и Long работают с одинаковой скоростью в процессоре (если конечно у них одинаковый тип операнда). Integer по идее тоже должен, но т.к. для 32-битного режима процессора это нестандартный размер операнда (требует префикса), то не стану этого утверждать.

Ответить

Номер ответа: 70
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #74
Добавлено: 12.05.05 15:09
Операнд-Регистр имеет свои подтипы. Это r8, r16 и r32. На скорость выполнения это никак не влияет, разве что на скорость загрузки команды в ковеер при работе с imm. Опкоды для каждого типа операнда разные, либо разные биты поля MOD R/M при одинаковых опкодах. Регистр - это участок памяти внутри процессора. И не имеет значения к какой его части ты обращаешся.

Ответить

Номер ответа: 75
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #75
Добавлено: 12.05.05 15:15

байтоное выравнивание - для оптимизации скорости. Для 32 разрядных значений (если их адрес выровнян по 4) считывание происходит за одну операцию. Для 8-битных используется т.н. "Byte Enable" line. Поскольку байт может располагаться в произвольном месте памяти и, соответственно, по шине он может быть не младшим разрядом, процессор должен еще привести его к младшему разряду (т.е. чтобы он был 255, а не 65535 и т.п.).

 Да, но это верно только для старых процессоров. Сейчас это уже не актуально. Ну и потом, всё равно в Window все адреса виртуальные (реальный линейный адрес лежит в сегментных регистрах). И выравнивание в виртуальном адресе не будет иметь никакого эффекта в реальном.

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам