![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Robus |
|
||||
|
Entire Профиль Группа: Участник Сообщений: 32 Регистрация: 15.12.2005 Репутация: 1 Всего: 1 |
Хотел оптимизировать свой код. В проекте есть множество мест, где в процедуры передаются стринги. В процессе исполнения кода, каждая така процедура вызывает копирование стринга в стек, что соответственно отбирает время процессора.
Например:
В данном случае вызов процедуры "__Win('Menu:',10,10)" создаст в стеке стринг, который в свою очередь при вызове "PRINT(S)" скопируется в новый стек. Я точно знаю, что процедуры "__Win" и "PRINT" никогда не модифицируют стринг, и что можно было бы описать в процедурах стринг как VAR. Но тогда я не смогу так просто делать вызов "__Win('Menu:',10,10)", и мне придётся входящий стринг описывать как отделную переменную. Поэтому я решил сделать две процедуры с одни именем, в одной из которых будет входить стринг как VAR, а в другой как локальная переменная. Например:
Однако компилятору это не понравилось. Как можно решить эту проблему ? Я понимаю, что можно создать процедуры с разными названиями, но это будет не красиво. Хотелось бы красивое решение ! |
||||
|
|||||
| dvamaster |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 559 Регистрация: 30.6.2004 Где: Россия : Курган Репутация: нет Всего: 10 |
В таком случае предавай PChar
но лучше
-------------------- Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/ Что же я сделал не так? /Король Лир/ Я делаю это для твоего же блага! /Любой родитель и палач/ PKUNZIP.ZIP /неизвестный/ |
||||
|
|||||
| Robus |
|
|||
|
Entire Профиль Группа: Участник Сообщений: 32 Регистрация: 15.12.2005 Репутация: 1 Всего: 1 |
С PChar есть ньюансы ... 1. У меня в коде большое количество фиксированных процедур без внешних стрингов, то есть запись непосредственно __Win('Menu:',10,10); !!! Но самое интересное, что почему-то PCHAR позволяет при компиляции не создавать внешни стринг, а PSTRING ругается. Не понятно !!! 2. У меня часто в стринг передаются параметры, например __Win(#22#0#0#14#7'Menu:',10,10); где 22 код координат и два числа и 14 код цвета. А PCHAR обрубает до нолика. Всё же классический стринг паскаля мне нравится больше. Но если не найду решение проблемы, то скорее всего перейду на PCHAR. В любом случае спасибо за помощь, жду ещё предложений ... |
|||
|
||||
| dvamaster |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 559 Регистрация: 30.6.2004 Где: Россия : Курган Репутация: нет Всего: 10 |
PChar является встроеным типом, для него много встроенных конверторов, в частности
PChar(строковая переменная) PChar('Какой-то текст') здесь в обоих случаях используется String который преобразуется в PChar встроенными методами так как на выходе получаем указатель на ANSI-строку, то она имеет длину до первого символа #0 для передачи строки с символом #0 это не годится PString - не является встроенным типом для компилятора, по этому нельзя вызвать процедуру так
выход
-------------------- Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/ Что же я сделал не так? /Король Лир/ Я делаю это для твоего же блага! /Любой родитель и палач/ PKUNZIP.ZIP /неизвестный/ |
||||
|
|||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| 1000000dollars |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 231 Регистрация: 6.10.2007 Репутация: нет Всего: 8 |
Я решил провести следственный эксперимент:
Результат получился следующий:
В первой группе вызовов (с короткой строкой) стек колеблется от 0x0013FF80 до 0x0013FF64. Во второй группе вызовов (с длинной строкой) стек колеблется от 0x0013FF80 до 0x0013FF64. Вывод: строка в стек не копируется. В стек передаётся адрес строки (указатель на строку). Кроме того Delphi умно работает со строками, поэтому содержимое строк копируется только в случае необходимости. Пример:
Вывод:
|
||||||||
|
|||||||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Robus |
|
|||
|
Entire Профиль Группа: Участник Сообщений: 32 Регистрация: 15.12.2005 Репутация: 1 Всего: 1 |
Да ... Точно ... Стринг не копируется ... Мало того, я перевёл всё в PCHAR, и результат стал на много хуже !!! Было 135 фпс, а стало 102 !!!
Нужно изучть более детально это ... Наверное зря я поднял этот вопрос, только форум засорил ... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |