2

Можно создать дубликат:
In PHP (>= 5.0), is passing by reference faster?Передача строки по ссылке на функцию ускорит работу? (PHP)

Интересно, объявляя пропуск параметра по ссылке, интерпретатор PHP будет быстрее не нужно копировать строку в локальной области видимости работы функции ? Сценарий превращает XML-файлы в CSV-файлы, которые имеют тысячи записей, поэтому подсчитывается мало времени.

это бы:


function escapeCSV(& $string) 
{ 
    $string = str_replace('"', '""', $string); // escape every " with "" 
    if(strpos($string, ',') !== false) 
     $string = '"'.$string.'"'; // if a field has a comma, enclose it with dobule quotes 
    return $string; 
} 

быть быстрее, чем это:


function escapeCSV($string) 
{ 
    $string = str_replace('"', '""', $string); // escape every " with "" 
    if(strpos($string, ',') !== false) 
     $string = '"'.$string.'"'; // if a field has a comma, enclose it with dobule quotes 
    return $string; 
} 

?

+1

Вы не можете передавать строки по ссылке. Вы можете передавать только переменные по ссылке. – Gumbo

+0

Дубликат http://stackoverflow.com/questions/178328/in-php-5-0-is-passing-by-reference-faster –

+0

Вот предпочтительное решение: http://ie.php.net/manual /en/function.fputcsv.php –

ответ

8

Не думаю, профиль.

Запускать скрипты, которые используют каждую версию функции для 100 000 повторений под, скажем, командой Unix time. Не размышляйте о том, что быстрее; узнайте.

+4

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

+0

«Не думай», конечно, немного гиперболично, чтобы подчеркнуть точку. – chaos

0

[...] так мало времени оптимизация рассчитывается.

Нет, они этого не делают.

Единственная настоящая оптимизация - это то, что помогает ВАМ читать и/или писать код быстрее. Вы не должны жертвовать простотой или удобочитаемостью производительности - это замедлит вас в долгосрочной перспективе.

Передача предметов по ссылке может быть особенно обманчивой. Вы можете столкнуться с странными проблемами позже, когда какой-то var изменяет таинственно. Вы изменяете ввод функций, что не всегда нормально работает. Каждый раз, когда вы делаете что-то необычное, вы должны помнить о них. Однако ваша память и внимание ограничены. Компьютер - нет. Не переуплодируйте.

Отладка в два раза сложнее, чем запись кода в первую очередь. Поэтому, если вы пишете код настолько умно, насколько это возможно, вы по определению недостаточно умны, чтобы его отлаживать. - Brian W. Kernighan

UPDATE

В этом случае вся ваша функция escapeCSV немного бессмысленно. Вы должны использовать fputcsv, который является базовой библиотекой PHP, написанной на C, таким образом, намного быстрее и эффективнее с точки зрения памяти.

+0

Downvote не был мной, и я согласен с тем, что вы должны написать читаемый код. Однако, если ваш сайт работает слишком медленно, вы потеряете посетителей (клиентов?), Потому что они не захотят дождаться загрузки вашей страницы. Таким образом, производительность исполнения может быть важна! – PTBNL

+0

Не в этом случае. Вы ищете микросекундные оптимизации. Это просто бессмысленно. –

+0

Да, я узнал позже о fputcsv. Но в любом случае, что вы написали ранее, я согласен, что для крупных проектов. Но это всего лишь сценарий импорта файлов, функция объявляется внутри скрипта и не будет использоваться никаким другим программистом. – Petruza

1

Я предполагаю, что это едва заметная оптимизация, которая потенциально может привести к неожиданным побочным эффектам в будущем. Например, следующий парень, вероятно, НЕ будет ожидать escapeCSV, чтобы изменить его параметр, и он может использовать параметр, который он передал, думая, что это все еще строка un-CSV'd.

Кроме того, поскольку строки не редактируются на месте, у вас уже есть два случая, когда в вашей функции создается новая строка (одна для str_replace, одна для конкатенации кавычек до/после нее). Еще один пример для случая с бай-ином не будет узким местом в вашем приложении.

1

PHP references are not pointers. Они ничего не ускоряют - на самом деле они делают наоборот, так как они требуют дополнительной внутренней записи в таблице символов.