За последние 24 часа нас посетили 18446 программистов и 1600 роботов. Сейчас ищут 936 программистов ...

Массив или константа - вот в чём вопрос...

Тема в разделе "Прочие вопросы по PHP", создана пользователем XprogeR, 12 май 2009.

  1. XprogeR

    XprogeR Активный пользователь

    С нами с:
    6 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    Доброго времени суток, хочу написать один скрипт для себя, и во в процессе задался вопросом а что быстрее, массивы или константы. Как показал небольшой эксперимент:
    PHP:
    1.  
    2. <?php
    3.     function getmicrotime()
    4.     {
    5.         list($msec, $sec ) = explode(" ", microtime());
    6.         return ((float)$msec+(float)$sec);
    7.     }
    8.  
    9.     $constant = getmicrotime();
    10.     for($i=0; $i<1000; $i++)
    11.     {
    12.         define("CONSTANT_".$i, $i);
    13.     }
    14.     $constant = getmicrotime()-$constant;
    15.    
    16.     $array = getmicrotime();
    17.     for($i=0; $i<1000; $i++)
    18.     {
    19.         $test_array['CONSTANT_'.$i] = $i;
    20.     }
    21.     $array = getmicrotime()-$array;
    22.    
    23.     echo "<br/>",($constant>$array)?"Array faster...":"Constant faster...";
    24.    
    25. ?>
    26.  
    Массивы примерно в 2-а раза быстрее. Хм... Ну оно и понятно, ведь при создании константа по идеи должна ещё проверять, а не существует ли такая-же. Вопрос заключается в том что в использовании будет быстрее, взять значение константы или массива, или разницы в принципе нет? Большая просьба, дайте ссылку на документацию или пояснит ответ, а то мне это спать не даст... Спасибо. =)
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Вы хоть разницу понимаете в массивах и константах?
    Это равносильно вкручиванию вилкой шурупа в бетонную стену.
     
  3. XprogeR

    XprogeR Активный пользователь

    С нами с:
    6 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    Я прекрасно осознаю разницу между массивом и константой. В данном случае мне интересен ответ на поставленный мною вопрос. А не лекция, о том где уместно использовать константу, а где массив.
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Зачем сравнивать принципиально разные вещи?
    Как их можно вообще сравнивать?
     
  5. XprogeR

    XprogeR Активный пользователь

    С нами с:
    6 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    Хм... Я понимаю некоторое негодование, но допустим, мне стало интересно, что и в каких случаях работает быстрее, а поскольку по этому вопросу я не нашёл вообще ни какой документации, то решил поинтересоваться на форуме. И я просто невероятно сильно хочу прояснить этот вопрос до конца.

    Apple:
    Я понимаю, что для вас этот вопрос несколько странный, но вилка, шуруп и бетонная стена мои! Что хочу то и делаю! =)
    Если вас не затруднит ответе по сути.
     
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Начнем хотя бы с того, что объявление константы осуществляется вызовом функции, которая размещает в памяти данные и именную ссылку. Константа является глобальной и не может быть уничтожена после вызова её в теле какой-либо функции, даже если она там объявлена.

    Да и вообще, что тут расписывать.
    Массивы и переменные конечно быстрее, но я ещё не видел проекта, в котором было бы хотябы 300 констант.
    На С++ видел проект, было максимум 30 (препроцессорные + проектные)
     
  7. XprogeR

    XprogeR Активный пользователь

    С нами с:
    6 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    Методом "научного тыка" определил что в случае с чтением опять же быстрее массив, примерно на 1/4, осталось выяснить почему, если не трудно опять же прошу привести какую-нибудь ссылку на документацию или пояснить. Дабы удовлетворить любопытство ув. Apple поясняю:

    Я пытаюсь понять как правильнее устроить хранения статических данных, чтобы это было это наносило минимальный ущерб быстродействию. Я готов пожертвовать некоторыми удобствами которые представляют константы, а именно нет ограничения области видимости, и т.д. для меня в данный момент важна производительность.
     
  8. XprogeR

    XprogeR Активный пользователь

    С нами с:
    6 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    Немножечко опередили. =)
    Ну хорошо, с тем что объявляться они медленно - всё понятно.
    Но чем обусловлено медленное чтение или я где-то допустил ошибку, эксперимент был приблизительно такой же как в первом посте.
     
  9. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    XprogeR
    Страшно представить, что вы собираетесь хранить в константах ...
    В коде должно быть ну ... по крайней мере не более 5 - 6 констант и если они нужны.
    Область видимости компенсируется правильно архитектурой кода, лично у меня только три константы: путь, модуль и идентификатор.
    Остальное всё спроектировано так, что даже ни разу не используется глобальный массив, хотя в вашем случае, если так бьётесь за производительность, ваш вариант.
     
  10. Все одинаковые. ©
    За исключением несущественных мелочей и константы и переменные хранянтся в однотипных zval-контейнерах.
    производительность решается совсем другими методами, и упирается в совсем другие узкие места.
     
  11. XprogeR

    XprogeR Активный пользователь

    С нами с:
    6 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    Я вполне согласен, с тем что вопрос производительности решается совсем другими методами, но в данном случае вопрос поставлен именно так, а разница всё-таки есть. По крайней мере для меня, в данный момент, она играет очень важную роль, пусть даже если она и незначительна, а так и есть.
     
  12. Да, я признаю, именно ваш случай предельно уникален, и ваши разумные теоретические доводы перекрывают мой наивный практический опыт.
     
  13. XprogeR

    XprogeR Активный пользователь

    С нами с:
    6 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    Хм... Ну я думаю язвить не стоит. Я просто подчеркнул, то что для меня это имеет значение. Обратите внимание для меня и о вашем опыте я ничего не говорил. Читайте внимательнее, я не навязываю вам этот способ или пример, я просто хочу понять это для себя, и не утверждаю что это правильно. Будьте сдержанными.
     
  14. VItalijs

    VItalijs Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    всех я думаю в этой теме, больше всего интересует то, зачем вам это нужно?
    Я не пишу больших проектов, но думаю статические данные в константах или массивах не самая медленная часть любой программы, как бы она ни была выполнена.
     
  15. XprogeR

    XprogeR Активный пользователь

    С нами с:
    6 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    На самом деле нечего страшного, на самом деле, даже если передавать параметров в функцию данные, это быстрее чем использование в той-же функции константу, хотя я подозреваю это уже зависит от размера передаваемых данных... Не уверен... Так как могут использоваться указатели, тогда это сводит на нет зависимость от размера данных, также в самом "эксперименте", может, имели место ошибки. Да и в общем, это не столь принципиально, потому что в итоге разница производительности даже на тех диких цифрах которые были указаны в листинге первого поста, не существенна, в итоге это было попросту интересно.

    PS: Спасибо за терпение, так как вопрос действительно, несколько не ординарный.

    Ну на вторую часть вопроса я ответил чуть выше! =)
    А вот первая, тут тоже нет никаких, ужасных тайн, просто я не хотел этого говорить по той причине, что суть вопроса потерялась бы когда мне начали бы указывать что и как я должен делать. А меня в итоге интересовала уже не сама реализация задуманного, сколько сама суть вопроса. Так вот это банальный файл конфигурации для разного рода CMS. Как видите, задача совсем тривиальная и далеко не масштабная, мне сразу сказали бы тут: это не критично - забудь, я предполагаю. =)

    Хотя вопрос на много глубже, но это уже совсем другая история! ^_^
     
  16. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    wxWidgets. :)
     
  17. это какая то особенность мышления, ящитаю. Мне в один-два таких каждую неделю встречается. Они еще как правило, в бога верят, да. Или в Высшее Благо. Или в Птаага. В общем, в «великую доминирующую силу, что скрыто мотивирует»
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    XprogeR
    Чем измерение времени выполнения не устраивают?
     
  19. XprogeR

    XprogeR Активный пользователь

    С нами с:
    6 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    В подобную чушь не верю, поскольку атеист. У каждого своя точка зрения, мне было попросту интересно. Я, по-моему, всё прояснил, чем вы ещё не довольны, ни кто в этой теме в том числе и я, не спрашивал вашего мнения относительно особенностей моего мышления, будьте любезны оставьте его при себе.

    Я в конце концов к этому и пришёл, но всё-же хотелось бы понять механизм, и одного и другого, просто, из любопытства. В итоге это иногда оказывается полезным не для оптимизации, а когда приходиться "танцевать с бубном", но поскольку изначально был затронут вопрос быстродействия, я отталкивался именно от этого.