Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Вопрос: Разгоняем CHR : Почти в 2 раза!
Добавлено: 08.05.05 22:08
Автор вопроса: Morpheus | Web-сайт:
Ответы
Всего ответов: 125
Номер ответа: 91
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #91
Добавлено: 12.05.05 16:15
Эффективность кеша сильно зависит от линейности кода. Если в программе мало команд ветвления - она будет максимальной, на деле же непрерывный кусок кода редко составляет 10-15 команд. Кроме того, для кеша справедливы те же правила что и для динамической памяти.
Про регистры я сказал к тому, что программа не может держать в них все данные. Если ты пишешь на асме - ты можешь выделить для себя наиболее частоиспользуемые. Как поступит компилятор - сказать нельзя. Скорее всего не так
Номер ответа: 92
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #92
Добавлено: 12.05.05 16:17
При считывании данных из ОЗУ (например, локальных переменных, для примера пусть их будет 5-6 двордов), при считывании первой переменной, соответствующей вершине стека (esp), данные из памяти не поступают непосредственно в регистры. Они сначала попадают в L1. Причём при чтении первой переменной в кэш попадут все наши 5-6 переменных, т.к. процессор подгружает в кэш данные порциями по 32 (или 2х32, в зависимости от проца) байт.
Да, но предварительная загрузка из памяти в кэш используется в то время, пока ты к памяти не обращаешся (работешь только с регистрами). Получается что сначала нужно осонвательно поработать с регистрами, пока память загрузится в кэш, а потом уже смело её использовать
Номер ответа: 93
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #93
Добавлено: 12.05.05 16:22
а в регистр влезут все переменные?
Номер ответа: 94
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #94
Добавлено: 12.05.05 16:22
2Morpheus )
Я говорю про тип данных Boolean, а не про булевые операции. То что ты предложил будет раза в два медленнее.
Номер ответа: 95
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #95
Добавлено: 12.05.05 16:23
LamerOnLine:
раза в 2 медленне чем что? (чем not?)
Номер ответа: 96
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #96
Добавлено: 12.05.05 16:34
Разумеется.
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Form_Load()
Dim Ticks As Long
Dim i As Long
Dim a As Long
Dim b As Long
Ticks = GetTickCount
For i = 1 To 100000000
a = Not b
Next i
Text1.Text = GetTickCount - Ticks
Ticks = GetTickCount
For i = 1 To 100000000
a = 1 - b
Next i
Text2.Text = GetTickCount - Ticks
End Sub
Первый вариант - 188
Второй вариант - 344
Как видишь, не поленился
При ненулевом b=5 второй вариант - 422
При b=100000000 соответственно снова 344.
Выводы...
Номер ответа: 97
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #97
Добавлено: 12.05.05 16:42
Дык низя же выполнить Not с long'ом ?!
Номер ответа: 98
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #98
Добавлено: 12.05.05 16:48
CyRax
По поводу "предварительная загрузка из памяти в кэш используется в то время, пока ты к памяти не обращаешся" - у меня есть некоторые сомнения, насколько я знаю, данные грузятся в кэш только при чтении их из ОЗУ. Даже при записи в ОЗУ они не грузятся, т.к. не нужны в кэше, а тем более грузить их когда не происходит обращений к данным - нерационально, они ведь могут вообще не понадобиться, зачем делать лишнюю работу? Имхо, это так.
Morpheus, регистров, относительно просто доступных для манипуляций - 8 штук (eax,ecx,edx,ebx,esp,ebp,esi,edi). Если кол-во твоих переменных не превышает этого количества, то извратившись, ты сможешь обойтись одними регистрами. Но за счёт усложнения алгоритма и некоторой потери "читабельности" кода. И опять же не применительно к VB.
А вообще, оптимизировать по большому счёту в VB очень сложно. Практически максимум, что можно сделать - это по возможности использовать лонги и по возможности располагать более длинные данные раньше чем более короткие, использовать строки, длиной кратные 4, в остальном понадеявшись на "интеллект" компилятора VB
Ну ещё в структурах делать пустые поля, чтобы
дополнять предыдущие поля до адресов, кратных 4.
Номер ответа: 99
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #99
Добавлено: 12.05.05 16:49
А не, понял , ок-ся можно, извиняюсь. У меня вот так получилось:
Private Sub Form_Load()
i = False
i = Not i
If i = True Then MsgBox "TRue"
End
End Sub
Номер ответа: 100
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #100
Добавлено: 12.05.05 16:51
В смысле? Ты о чем?
Номер ответа: 101
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #101
Добавлено: 12.05.05 16:54
пример
Private Sub Form_Load()
MsgBox Not 5
MsgBox Not 255
MsgBox Not 21314143
End Sub
Результат
-6
-256
-21314144
Номер ответа: 102
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #102
Добавлено: 12.05.05 16:55
2 LamerOnLine
Это ко мне? Да, глюконул малость (#97) щас врубился
Номер ответа: 103
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #103
Добавлено: 12.05.05 16:57
Дело в том, что есть соблазн подумать, что переменная типа Boolean занимает 1 бит, ведь принимает по большому счёту всего два значения хотя и известно, что у Истины диапазон значений кажись
Номер ответа: 104
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #104
Добавлено: 12.05.05 16:58
Ну, никто и не надеется оптимизировать код на VB. Но зло, несомое компилятором, можно свести к минимуму. Если есть такая возможность - ИМХО, нужно ей пользоваться, VB не настолько hi-speed платформа чтобы этой возможностью пренебрегать. Даже в ущерб другим параметрам, таким как размер и читабельность кода и т.п.
Номер ответа: 105
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #105
Добавлено: 12.05.05 17:01
Соблазн может и есть, но занимает она два байта. За каким - трудно сказать, может для скорости оптимизировали. В сях так вообще четыре. Конечно, бредово использовать 32 бита, из которых значащий только один, но такова жизнь программиста...