SASGIS - SAS.Планета
View Issue Details
0001268SAS.ПланетаРефакторингpublic07-04-2012 13:2710-10-2012 11:47
zed 
vdemidov 
normalminorN/A
closedfixed 
WindowsXPSP3
.Nightly 
120808120808 
0001268: Мелкие оптимизации в больших количествах (646 оптимизаций)
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
No tags attached.
txt OptimizationReport.txt (77,196) 07-04-2012 13:27
http://www.sasgis.org/mantis/file_download.php?file_id=744&type=bug
Issue History
07-04-2012 13:27zedNew Issue
07-04-2012 13:27zedFile Added: OptimizationReport.txt
07-04-2012 13:40zedNote Added: 0006408
07-04-2012 15:06vasketsovNote Added: 0006409
07-04-2012 15:08vasketsovNote Edited: 0006409bug_revision_view_page.php?bugnote_id=6409#r3181
07-04-2012 15:09vasketsovNote Edited: 0006409bug_revision_view_page.php?bugnote_id=6409#r3182
07-04-2012 19:19vdemidovNote Added: 0006413
07-04-2012 19:35vdemidovNote Added: 0006414
07-04-2012 20:10vasketsovNote Added: 0006415
07-04-2012 20:13vasketsovNote Edited: 0006415bug_revision_view_page.php?bugnote_id=6415#r3184
07-04-2012 20:30vasketsovNote Edited: 0006415bug_revision_view_page.php?bugnote_id=6415#r3185
11-04-2012 19:40vdemidovNote Added: 0006419
11-04-2012 20:00zedNote Added: 0006420
11-04-2012 20:14vasketsovNote Added: 0006421
17-04-2012 10:14vdemidovStatusnew => resolved
17-04-2012 10:14vdemidovFixed in Version => 120808
17-04-2012 10:14vdemidovResolutionopen => fixed
17-04-2012 10:14vdemidovAssigned To => vdemidov
14-05-2012 08:32vdemidovTarget Version => 120808
10-10-2012 11:47TolikStatusresolved => 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
Это либо я не понял, либо не понимаю, что именно предлагается в конкретных случаях.

(0006413)
vdemidov   
07-04-2012 19:19   
Ну я так понимаю, интерфейсы желательно передавать как константы, потому что тогда компилятор сможет сгенерить код без лишних изменений счетчика ссылок, а это две интерлокед операции.

А где эту софтинку можно взять? Это все нужно потихоньку править.
(0006414)
vdemidov   
07-04-2012 19:35   
>>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 реализуются?

(0006419)
vdemidov   
11-04-2012 19:40   
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" и речи нет?

Да и читаемость кода при таком подходе хуже, нежели явная передача переменных.
(0006421)
vasketsov   
11-04-2012 20:14   
Судя по всему надо по месту смотреть, в зависимости от числа параметров и т.п.