SASGIS - SAS.Планета |
View Issue Details |
|
ID | Project | Category | View Status | Date Submitted | Last Update |
0001268 | SAS.Планета | Рефакторинг | public | 07-04-2012 13:27 | 10-10-2012 11:47 |
|
Reporter | zed | |
Assigned To | vdemidov | |
Priority | normal | Severity | minor | Reproducibility | N/A |
Status | closed | Resolution | fixed | |
Platform | Windows | OS | XP | OS Version | SP3 |
Product Version | .Nightly | |
Target Version | 120808 | Fixed in Version | 120808 | |
|
Summary | 0001268: Мелкие оптимизации в больших количествах (646 оптимизаций) |
Description | 1. Missing "const" for unmodified string parameter: 308
2. Missing "const" for unmodified record parameter: 63
3. Missing "const" for unmodified array parameter: 19
4. Array properties that are referenced/set within methods: 3
5. Virtual methods (procedures/functions) that are not overridden: 229
6. Local subprograms with references to outer local variables: 24
Отчёт сгенерирован при помощи Peganza Pascal Analyzer 6.1.2 для SAS.Планета 5332 |
Steps To Reproduce | |
Additional Information | |
Tags | No tags attached. |
Relationships | |
Attached Files | OptimizationReport.txt (77,196) 07-04-2012 13:27 http://www.sasgis.org/mantis/file_download.php?file_id=744&type=bug |
|
Issue History |
Date Modified | Username | Field | Change |
07-04-2012 13:27 | zed | New Issue | |
07-04-2012 13:27 | zed | File Added: OptimizationReport.txt | |
07-04-2012 13:40 | zed | Note Added: 0006408 | |
07-04-2012 15:06 | vasketsov | Note Added: 0006409 | |
07-04-2012 15:08 | vasketsov | Note Edited: 0006409 | bug_revision_view_page.php?bugnote_id=6409#r3181 |
07-04-2012 15:09 | vasketsov | Note Edited: 0006409 | bug_revision_view_page.php?bugnote_id=6409#r3182 |
07-04-2012 19:19 | vdemidov | Note Added: 0006413 | |
07-04-2012 19:35 | vdemidov | Note Added: 0006414 | |
07-04-2012 20:10 | vasketsov | Note Added: 0006415 | |
07-04-2012 20:13 | vasketsov | Note Edited: 0006415 | bug_revision_view_page.php?bugnote_id=6415#r3184 |
07-04-2012 20:30 | vasketsov | Note Edited: 0006415 | bug_revision_view_page.php?bugnote_id=6415#r3185 |
11-04-2012 19:40 | vdemidov | Note Added: 0006419 | |
11-04-2012 20:00 | zed | Note Added: 0006420 | |
11-04-2012 20:14 | vasketsov | Note Added: 0006421 | |
17-04-2012 10:14 | vdemidov | Status | new => resolved |
17-04-2012 10:14 | vdemidov | Fixed in Version | => 120808 |
17-04-2012 10:14 | vdemidov | Resolution | open => fixed |
17-04-2012 10:14 | vdemidov | Assigned To | => vdemidov |
14-05-2012 08:32 | vdemidov | Target Version | => 120808 |
10-10-2012 11:47 | Tolik | Status | resolved => closed |
Notes |
|
(0006408)
|
zed
|
07-04-2012 13:40
|
|
Так же, эта утилитка выплюнула около 2,5 тысяч варнингов с заголовком "Interfaces passed as parameters without "const" directive"... походу интерфейсы нужно _всегда_ передавать как константы? |
|
|
(0006409)
|
vasketsov
|
07-04-2012 15:06
(edited on: 07-04-2012 15:09) |
|
>Missing "const" for unmodified string parameter
И это плохо.
>Missing "const" for unmodified array parameter
Такого по идее вообще нельзя допускать. Передавать указатель (пусть и через const). То же с рекордами.
>нужно _всегда_ передавать как константы?
По идее всё неизменяемое надо указывать как const. Потому что формально компилятор должен давать по рукам, если из процы с const зовётся проца без const. Но он в этом случае занимается "копированием" (очевидно для обратной совместимости). Одно дело если в стек уронить int (тут как бы нет копирования), а строки и интерфейсы - совсем другое.
Если интерфес передать как const - я так понимаю у него счётчик ссылок не будет меняться (не работает конструктор копирования). Значит если в рамках одной процы создать поток и отдать в него интерфейс как const а потом обNILить - поток грохнется при обращении к интерфейсу? Но вроде как все "долгоживующие" экземпляры интерфейсов в поля объектов падают, так что наверное 99% надо с const их передавать.
Я для себя ещё давным-давно придумал: если параметр явно не меняется независимо от типа - пиши const. Где надо - компилятор сам укажет на изменение константного параметра.
>Local subprograms with references to outer local variables
Это либо я не понял, либо не понимаю, что именно предлагается в конкретных случаях.
|
|
|
|
Ну я так понимаю, интерфейсы желательно передавать как константы, потому что тогда компилятор сможет сгенерить код без лишних изменений счетчика ссылок, а это две интерлокед операции.
А где эту софтинку можно взять? Это все нужно потихоньку править. |
|
|
|
>>Local subprograms with references to outer local variables
> Это либо я не понял, либо не понимаю, что именно предлагается в конкретных случаях.
Предлагается передавать их во вложенные процедуры явным образом. И это правильно. |
|
|
(0006415)
|
vasketsov
|
07-04-2012 20:10
(edited on: 07-04-2012 20:30) |
|
Что ж тут правильного? Вместо дешёвейших jmp при нескольких параметрах будет генериться стек. Вроде как суть темы - оптимизация, а не чтобы тулза ничего не выдавала. А под оптимизацией должен пониматься некий критерий оптимальности, скорость, размер, а вовсе не абстрактная "красота". Коли нет в конкретном случае ничего оптимальнее чем тупой jmp на кусок кода в рамках того же стека из кучи мест в процедуре - нужны крайне веские основания, чтобы переделывать неотпимально.
>Array properties that are referenced/set within methods
Это тоже непонятно. Вроде бы Array properties всегда через methods реализуются?
|
|
|
|
Local subprograms with references to outer local variables
This section shows nestled local procedures, with references to outer local variables. Those local variables require some special stack manipulation so that the variables of the outer routine can be seen by the inner routine. This results in a good bit of overhead. |
|
|
(0006420)
|
zed
|
11-04-2012 20:00
|
|
>require some special stack manipulation
Т.е. тут не то что выгода, тут наоборот, ущерб быстродействию? О "дешёвейших jmp" и речи нет?
Да и читаемость кода при таком подходе хуже, нежели явная передача переменных. |
|
|
|
Судя по всему надо по месту смотреть, в зависимости от числа параметров и т.п. |
|