Быстрый передача параметров в Дельфи 7?


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

// slow since the data must be copied to another location 
// in memory and passed to myfunction
function myfunction(data: string): boolean;   

// faster since a pointer to the original data is passed to 
// the function and data is never copied
function myfunction(var data: string): boolean;   

// no idea ??!!!
function myfunction(const data: string): boolean;  


2625
9
задан 20 сентября 2011 в 06:09 Источник Поделиться
Комментарии
3 ответа

Резюме

Проходя мимо константный является самым быстрым для Делфи строковые типы.

Детали


function myfunction(data: string): boolean;


Медленно, поскольку данные должны быть скопированы в другое место в памяти и передается в myfunction в консоли

Это не то, что происходит. На самом деле звонящий ничего не делает больше, чем проходной строковой переменной, сохраняется в качестве указателя на функцию. Что происходит в myfunction в консоли заключается в том, что счетчик ссылок на строку увеличивается и уменьшается на выходе. Это требует беспрекословного попробовать/наконец, должны быть записаны в код, чтобы убедиться, что уменьшение происходит в случае исключения. Ссылка считая код и попробовать/наконец-то потреблять время.

Обратите внимание, что содержимое строки не копируются, потому что строки Делфи оптимизированы для использования копирования при записи. Вы платите только цену копируя их, если вы измените строку.


function myfunction(var data: string): boolean;


Быстрее, так как указатель на исходные данные, переданные функции и данные не копируются

Это практически эквивалентно предыдущим кодом ценность выше. Параметр (т. е. указатель на строку) передается по ссылке, а не значению, а в остальном нет никаких различий.


function myfunction(const data: string): boolean;

И теперь мы подходим к победителю. Поскольку функция не может изменять содержимое строки, компилятор может пропустить подсчет ссылок код и попробовать/наконец-то. Это самый быстрый из всех.

12
ответ дан 17 ноября 2011 в 10:11 Источник Поделиться

Если код в myfunction в консоли не изменять строки, тогда, на удивление, все три варианта одинаковы. Строки в Delphi использовать "копирования при записи семантики" (см. Последний абзац AnsiString в помощь), поэтому они не копируются, пока вы не измените их.

С другой стороны, "ВАР" и "константный" будут иметь одинаковую скорость. Цитата из справки: постоянных параметров аналогичны значениям параметров, за исключением того, что вы не можете присвоить значение постоянного параметра в теле процедуры или функции, и вы можете пройти как ВАР параметра другой процедуры.

Поэтому, учитывая специфику обработки строк, первый вариант, без каких-либо модификаторов, будет вести себя довольно равным к другим - строка передается как указатель, и будет копироваться, только когда код будет писать.

В любом случае, чтобы быть уверенным на 100%, я предлагаю вам написать тест профилирования. Это довольно легко с помощью диагностики.TStopwatch.

1
ответ дан 10 октября 2011 в 07:10 Источник Поделиться

Это выглядит как сайте StackOverflow вопрос 1951192. Если у вас есть реальная потребность в производительности, то попробуйте есть предложение использовать FastMM4. Вы правы в том, что передача по ссылке должно сдуть передачи по значению для скорости на больших строк (или большие какие-то данные).

Он также может быть стоит бенчмаркинга (данные Варе:строки) и (данные const:string) в случае, если компилятор оптимизирует раз лучше, чем другие. Если они одинаковы, использовать const, если ваша функция не должна изменять содержимое строк.

0
ответ дан 27 сентября 2011 в 09:09 Источник Поделиться