2016-01-29 3 views
-1

Я написал небольшой скрипт для создания адресов электронной почты на основе шаблона:Выход терминала медленнее, чем запись файла?

<?php 
$host = '@gmail.com'; 
$prefix = 'email'; 
$total = 200000; 

for($i = 0; $i <$total; $i++) 
{ 
    echo $prefix . $i . $host . PHP_EOL; 
} 

Теперь, если я запускаю этот скрипт как $php generate.php она занимает около 15 секунд, чтобы завершить выходное эхо. Однако перенаправление вывода ($php generate.php > file) завершается в течение секунды.

Это что-то связано с механизмом буферизации PHP или частью какого-либо поведения Linux?

+0

Если вы запустите его непосредственно в терминале, вывод должен быть буферизирован и отображен. это будет иметь место с окнами, linux, mac и любой другой системой с консолью. –

+0

@FranzGleichmann Думал так много. Благодаря! – dotslash

ответ

1

Это Linux, который вызывает замедление. То же самое произойдет, если вы напечатаете вывод в консоли Windows. Каждый сброс вывода обязывает программу останавливаться, операционная система обновляет свое окно, а программа, для которой требуется управление, будет продолжена. Если эти флеши многочисленны и часто, это может действительно немного замедлить работу.

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

2

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

+0

Спасибо. У меня возникло подозрение, что это так, и попросил нескольких человек в моем офисе. Но никто не мог ответить на него, поэтому я разместил здесь. : D – dotslash