Доброго времени суток, хочу написать один скрипт для себя, и во в процессе задался вопросом а что быстрее, массивы или константы. Как показал небольшой эксперимент: PHP: <?php function getmicrotime() { list($msec, $sec ) = explode(" ", microtime()); return ((float)$msec+(float)$sec); } $constant = getmicrotime(); for($i=0; $i<1000; $i++) { define("CONSTANT_".$i, $i); } $constant = getmicrotime()-$constant; $array = getmicrotime(); for($i=0; $i<1000; $i++) { $test_array['CONSTANT_'.$i] = $i; } $array = getmicrotime()-$array; echo "<br/>",($constant>$array)?"Array faster...":"Constant faster..."; ?> Массивы примерно в 2-а раза быстрее. Хм... Ну оно и понятно, ведь при создании константа по идеи должна ещё проверять, а не существует ли такая-же. Вопрос заключается в том что в использовании будет быстрее, взять значение константы или массива, или разницы в принципе нет? Большая просьба, дайте ссылку на документацию или пояснит ответ, а то мне это спать не даст... Спасибо. =)
Вы хоть разницу понимаете в массивах и константах? Это равносильно вкручиванию вилкой шурупа в бетонную стену.
Я прекрасно осознаю разницу между массивом и константой. В данном случае мне интересен ответ на поставленный мною вопрос. А не лекция, о том где уместно использовать константу, а где массив.
Хм... Я понимаю некоторое негодование, но допустим, мне стало интересно, что и в каких случаях работает быстрее, а поскольку по этому вопросу я не нашёл вообще ни какой документации, то решил поинтересоваться на форуме. И я просто невероятно сильно хочу прояснить этот вопрос до конца. Apple: Я понимаю, что для вас этот вопрос несколько странный, но вилка, шуруп и бетонная стена мои! Что хочу то и делаю! =) Если вас не затруднит ответе по сути.
Начнем хотя бы с того, что объявление константы осуществляется вызовом функции, которая размещает в памяти данные и именную ссылку. Константа является глобальной и не может быть уничтожена после вызова её в теле какой-либо функции, даже если она там объявлена. Да и вообще, что тут расписывать. Массивы и переменные конечно быстрее, но я ещё не видел проекта, в котором было бы хотябы 300 констант. На С++ видел проект, было максимум 30 (препроцессорные + проектные)
Методом "научного тыка" определил что в случае с чтением опять же быстрее массив, примерно на 1/4, осталось выяснить почему, если не трудно опять же прошу привести какую-нибудь ссылку на документацию или пояснить. Дабы удовлетворить любопытство ув. Apple поясняю: Я пытаюсь понять как правильнее устроить хранения статических данных, чтобы это было это наносило минимальный ущерб быстродействию. Я готов пожертвовать некоторыми удобствами которые представляют константы, а именно нет ограничения области видимости, и т.д. для меня в данный момент важна производительность.
Немножечко опередили. =) Ну хорошо, с тем что объявляться они медленно - всё понятно. Но чем обусловлено медленное чтение или я где-то допустил ошибку, эксперимент был приблизительно такой же как в первом посте.
XprogeR Страшно представить, что вы собираетесь хранить в константах ... В коде должно быть ну ... по крайней мере не более 5 - 6 констант и если они нужны. Область видимости компенсируется правильно архитектурой кода, лично у меня только три константы: путь, модуль и идентификатор. Остальное всё спроектировано так, что даже ни разу не используется глобальный массив, хотя в вашем случае, если так бьётесь за производительность, ваш вариант.
Все одинаковые. © За исключением несущественных мелочей и константы и переменные хранянтся в однотипных zval-контейнерах. производительность решается совсем другими методами, и упирается в совсем другие узкие места.
Я вполне согласен, с тем что вопрос производительности решается совсем другими методами, но в данном случае вопрос поставлен именно так, а разница всё-таки есть. По крайней мере для меня, в данный момент, она играет очень важную роль, пусть даже если она и незначительна, а так и есть.
Да, я признаю, именно ваш случай предельно уникален, и ваши разумные теоретические доводы перекрывают мой наивный практический опыт.
Хм... Ну я думаю язвить не стоит. Я просто подчеркнул, то что для меня это имеет значение. Обратите внимание для меня и о вашем опыте я ничего не говорил. Читайте внимательнее, я не навязываю вам этот способ или пример, я просто хочу понять это для себя, и не утверждаю что это правильно. Будьте сдержанными.
всех я думаю в этой теме, больше всего интересует то, зачем вам это нужно? Я не пишу больших проектов, но думаю статические данные в константах или массивах не самая медленная часть любой программы, как бы она ни была выполнена.
На самом деле нечего страшного, на самом деле, даже если передавать параметров в функцию данные, это быстрее чем использование в той-же функции константу, хотя я подозреваю это уже зависит от размера передаваемых данных... Не уверен... Так как могут использоваться указатели, тогда это сводит на нет зависимость от размера данных, также в самом "эксперименте", может, имели место ошибки. Да и в общем, это не столь принципиально, потому что в итоге разница производительности даже на тех диких цифрах которые были указаны в листинге первого поста, не существенна, в итоге это было попросту интересно. PS: Спасибо за терпение, так как вопрос действительно, несколько не ординарный. Ну на вторую часть вопроса я ответил чуть выше! =) А вот первая, тут тоже нет никаких, ужасных тайн, просто я не хотел этого говорить по той причине, что суть вопроса потерялась бы когда мне начали бы указывать что и как я должен делать. А меня в итоге интересовала уже не сама реализация задуманного, сколько сама суть вопроса. Так вот это банальный файл конфигурации для разного рода CMS. Как видите, задача совсем тривиальная и далеко не масштабная, мне сразу сказали бы тут: это не критично - забудь, я предполагаю. =) Хотя вопрос на много глубже, но это уже совсем другая история! ^_^
это какая то особенность мышления, ящитаю. Мне в один-два таких каждую неделю встречается. Они еще как правило, в бога верят, да. Или в Высшее Благо. Или в Птаага. В общем, в «великую доминирующую силу, что скрыто мотивирует»
В подобную чушь не верю, поскольку атеист. У каждого своя точка зрения, мне было попросту интересно. Я, по-моему, всё прояснил, чем вы ещё не довольны, ни кто в этой теме в том числе и я, не спрашивал вашего мнения относительно особенностей моего мышления, будьте любезны оставьте его при себе. Я в конце концов к этому и пришёл, но всё-же хотелось бы понять механизм, и одного и другого, просто, из любопытства. В итоге это иногда оказывается полезным не для оптимизации, а когда приходиться "танцевать с бубном", но поскольку изначально был затронут вопрос быстродействия, я отталкивался именно от этого.