Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Приведение типов или их проверка, что будет быстрее работать? 
V
    Опции темы
WIPS
Дата 31.7.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 1
Всего: 8



У нас есть код:
Код

error_reporting(E_ALL);
$string = 'this is string!';
array_unique($string);

Вместо array_unique() может быть любая функция, кот. принимает на вход массив. Естественно он выдает нотисоварененги такого типа:
Код

Notice: Undefined variable: array in ... on line ...
Warning: array_unique() [function.array-unique]: The argument should be an array in ... on line ...

Какая обработка этой ситуации будет быстрее?:
Код

array_unique((array)$string);    // приведение типов
// или
if (is_array($string)) {        // проверка типов
    array_unique($string);
}


--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Avrely
Дата 31.7.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 15.3.2007

Репутация: нет
Всего: 2



Код

<?php
    error_reporting(0);
    
    function gettime()
    {
    $time = explode(" ", microtime());    
    $real_time = $part_time[1].substr($time[0],1);
    return $real_time;
    }
    
    
    
    $time1 = gettime();
    array_unique((array)$string);    // приведение типов
    $time2 = gettime();
    $sum = bcsub($time2, $time1,6);
    ?> На выполнение "array_unique((array)$string);"   затрачено <b><?=$sum?></b> секунд  <br><br><?
    

// или


    $time1 = gettime();
if (is_array($string)) {        // проверка типов
    array_unique($string);
}
    $time2 =gettime();
    $sum = bcsub($time2, $time1,6);    ?> На выполнение "<pre>if (is_array($string)) {        // проверка типов
    array_unique($string);
}</pre>"   затрачено <b><?=$sum?></b> секунд  <br><br><?
    
    
    
    
    $time1 = gettime();
    $string = array();
    $time2 =gettime();
    $sum = bcsub($time2, $time1,6);    ?> На выполнение "    $string[] = array();
"   затрачено <b><?=$sum?></b> секунд  <?
    
    
    ?>


Мои результаты 
Код

На выполнение "array_unique((array)$string);" затрачено 0.000020 секунд 

На выполнение "
if (is_array($string)) {        // проверка типов
    array_unique($string);
}
" затрачено 0.000008 секунд 

На выполнение " $string[] = array(); " затрачено 0.000006 секунд

PM MAIL ICQ MSN   Вверх
Ипатьев
Дата 31.7.2009, 18:39 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Это шутка? Скажите мне, что это шутка.
PM MAIL   Вверх
nerezus
Дата 31.7.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



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


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
icewind
Дата 31.7.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 11.4.2009
Где: Ростов-на-Дону

Репутация: 20
Всего: 20



Цитата(WIPS @  31.7.2009,  17:02 Найти цитируемый пост)
У нас есть код:

$string = 'this is string!';
array_unique((array)$string);

шедевр  smile 

Почитай что такое типы и структуры данных в любом другом языке и в php конкретно. 


--------------------
user posted image
PM MAIL Skype   Вверх
krundetz
Дата 31.7.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Ипатьев @  31.7.2009,  18:39 Найти цитируемый пост)
Это шутка? Скажите мне, что это шутка. 

Шутка.

WIPS, разница настолько несущественна, что можно ею пренебречь.
Только проблема не в этом, а в том что сравнивать два этих участка кода некорректно, так как они подразумевают разную логику!


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
morfus
Дата 31.7.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 30.6.2007

Репутация: 1
Всего: 2



Проблема тут не в том "что быстрее" а в том "что разумнее" для данного случая, я чаще встречаюсь с ситуациями когда только проверка, приведение к тем или иным типам вообще встречается в моей (почти 5-ти летней) РНР-практике ОЧЕНЬ редко...
PM MAIL WWW   Вверх
WIPS
Дата 1.8.2009, 14:16 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 1
Всего: 8



Avrely наверное прав. Только надо будет провести нормальный эксперимент, хотя бы по 1000 раз прогнать разные варианты.


Цитата(nerezus @  31.7.2009,  17:52 Найти цитируемый пост)
Со своей стороны могу предложить платное обучение по скайпу. 

nerezus, вы каким-то образом можете подтвердить свою квалификацию (как программиста так и преподавателя)?


Цитата(icewind @  31.7.2009,  18:38 Найти цитируемый пост)
Почитай что такое типы и структуры данных в любом другом языке и в php конкретно.

icewind, не надо таких высокомерных выпадов, я осведомлен в теме, а если Вам вопрос кажется глупым можете на него не отвечать. К чему Ваш комментарий? Флуда ради...
Специально для тех кого видимо смущает строка могу привести такой пример:
Код

error_reporting(E_ALL);
$not_array = null;
array_unique($not_array);



Цитата(krundetz @  31.7.2009,  21:13 Найти цитируемый пост)
WIPS, разница настолько несущественна, что можно ею пренебречь.

krundetz, разница несущественна если прогнать один раз, а если 1000? А прогоняется такого типа участок кода очень много раз.


morfus, в данном случае мне нужно, чтобы в этом участке у меня не возникал Warning если передается не тот тип данных. И я ищу наиболее быстрый способ обработки такой ситуации.


Вообщем, провел я эксперимент:
Код

    error_reporting(E_ALL);
    $not_array = null;
    
    $ts = microtime(true);
    for ($i = 0; $i < 1000000; $i++) {
        if (is_array($not_array)) {
            array_unique($not_array);
        }
    }
    $pt = microtime(true) - $ts;
    echo "Проверка типов: $pt c.\n";
    
    $ts = microtime(true);
    for ($i = 0; $i < 1000000; $i++) {
        array_unique((array)$not_array);
    }    
    $ct = microtime(true) - $ts;
    echo "Приведение типов: $ct c.\n";
    echo "Проверка типов быстрее в " . ($ct / $pt) . " раз.";

Результат:
Код

Проверка типов: 20.706568002701 c.
Приведение типов: 21.780067920685 c.
Проверка типов быстрее в 1.0518434497616 раз.

krundetz был прав - разницы нет. 
Спасибо тем, кто пытался помочь - за попытку помощи smile остальным спасибо за то что вы просто есть такие какие есть, а не еще хуже ;)
Вопрос закрыт.
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Ипатьев
Дата 1.8.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Цитата(WIPS @  1.8.2009,  14:16 Найти цитируемый пост)
А прогоняется такого типа участок кода очень много раз.

1. Очень много - это сколько? В цифрах?
2. Данная проверка - единственное, что выполняется, или скрипт еще что-то делает? 
Почему бы не проводить тесты с реальными данными и с реальными массивами? Чтобы убедиться, что операция, которая выполняется 0,01% от общего времени выполнения будь она хоть в 10 раз медленнее, на общее время не повлияет?

Откуда такое желание оптимизировать самые мизерные операции?
Скрипт, которому надо выполнить тысячу раз array_unique - неоптимальный по определению. Т оптимизировать надо архитектуру, которая приводит к таким задачам. Вот это будет оптимизация. А "проверка или приведение" - это не оптимизация, а крохоборство.
PM MAIL   Вверх
icewind
Дата 1.8.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 11.4.2009
Где: Ростов-на-Дону

Репутация: 20
Всего: 20



Цитата(WIPS @  1.8.2009,  14:16 Найти цитируемый пост)
К чему Ваш комментарий

К тому что если функция ожидает на входе массив, то нужно передать ей массив, а не строку, приведенную к массиву и это уже вопрос нормальной архитектуры... Таких конструкций в принципе быть не должно. 

Пардон, конечно, если ответ показался высокомерным, я не хотел ни кого обижать. Возможно просто излишне красочно показал надуманность проблемы   smile 


--------------------
user posted image
PM MAIL Skype   Вверх
nerezus
Дата 1.8.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Цитата

nerezus, вы каким-то образом можете подтвердить свою квалификацию (как программиста так и преподавателя)?
 Таким, которые вас удовлетворят - нет. Только сданные тестирования левых контор типа retratech/intuit.
Возможно задумаюсь о получении сертификата Zend.
Максимальная сумма за заказ - $5k.

Цитата

А прогоняется такого типа участок кода очень много раз.
 Неверно. Прогон синтетического кол-ва раз задачи не сможет дать представления о том, как это будет в реальной задаче.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
krundetz
Дата 1.8.2009, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(WIPS @  1.8.2009,  14:16 Найти цитируемый пост)
Avrely наверное прав. Только надо будет провести нормальный эксперимент, хотя бы по 1000 раз прогнать разные варианты.

для нормального эксперимента советую иметь законченый проект и прогнать его через дебагер.
Цитата(WIPS @  1.8.2009,  14:16 Найти цитируемый пост)
А прогоняется такого типа участок кода очень много раз.

Ʃ2 = Ʃ2 при n от 1 до 1000
Цитата(WIPS @  1.8.2009,  14:16 Найти цитируемый пост)
morfus, в данном случае мне нужно, чтобы в этом участке у меня не возникал Warning если передается не тот тип данных. И я ищу наиболее быстрый способ обработки такой ситуации.

Угу и теперь варнинг возникнит у тебя в дальнейшем, так как приводя к массиву строку ты получишь массив из одного элемента значением которого будет строка, если ты хочешь выкинуть из строки повторяющиеся символы, то массив должен состоять из символов заключенных в строку. Отсюда вывод необходимо проверить переменную на то являеться ли она массивом и если нет попробовать этот массив создать, и только потом выкидывать оттуда не уникальные элементы.
Цитата(Ипатьев @  1.8.2009,  14:37 Найти цитируемый пост)
оптимизировать надо архитектуру

+1
после того как готова черновой вариант проекта
Цитата(nerezus @  1.8.2009,  17:45 Найти цитируемый пост)
Неверно. Прогон синтетического кол-ва раз задачи не сможет дать представления о том, как это будет в реальной задаче. 

+1
Надо смотреть на реальном проекте, возможно оптимизировать необходимо будет соверешенно в другом месте!

Оптимизировать до получения готового проекта бессмыслено так как неизвестно что нужно оптимизировать!



--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
WIPS
Дата 2.8.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 1
Всего: 8



Дорогие любители "реальных" проектов и "идеальной" архитектуры, почему если ч-к задает вопрос, то Вы считаете его сразу глупее себя и начинаете учить жизни? В теме был указан конкретный вопрос, хотелось бы получить ответ или хотя бы совет. Про архитектуру проектов и канонические способы оптимизации человек может быть еще и поболее вас знает. И если бы был вопрос по архитектуре это было бы отражено в теме. Была приведена, если хотите, академическая задача, чтобы конкретизировать вопрос. Неужели Вам было бы интересней разбирать N тыс. строк кода? Да архитектура не идеальна, да есть индуизмы, да есть много минусов, а как вы хотите, если проект работает уже 8-й год. Половины технологий кот. в нем сейчас используются еще даже не существовали когда он начинался. Разработчики меняются, задачи меняются - проект живой, нельзя в нем изменить архитектуру за один вечер, поэтому иногда приходится заниматься и такой "блошиной" оптимизацией - да не эффективно, но дает результат, и дает его быстро. Пользователи не будут ждать пока архитектура поменяется, а уйдут у конкурентам.

В общем, ребята, по моему в этой теме все просто пытались поумничать, а не помочь... жаль, раньше на форуме такого было меньше.

Кому интересно отвечу на ваши вопросы.

Цитата(Ипатьев @  1.8.2009,  13:37 Найти цитируемый пост)
1. Очень много - это сколько? В цифрах?

по данным xDebug - 2357 раз.

Цитата(Ипатьев @  1.8.2009,  13:37 Найти цитируемый пост)
2. Данная проверка - единственное, что выполняется, или скрипт еще что-то делает? 

не задавайте глупых вопросов

Цитата(Ипатьев @  1.8.2009,  13:37 Найти цитируемый пост)
Откуда такое желание оптимизировать самые мизерные операции?
Скрипт, которому надо выполнить тысячу раз array_unique - неоптимальный по определению. Т оптимизировать надо архитектуру, которая приводит к таким задачам. Вот это будет оптимизация. А "проверка или приведение" - это не оптимизация, а крохоборство.

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

Цитата(icewind @  1.8.2009,  15:05 Найти цитируемый пост)
К тому что если функция ожидает на входе массив, то нужно передать ей массив, а не строку, приведенную к массиву и это уже вопрос нормальной архитектуры

про архитектуру см. вступление к моему посту

Цитата(nerezus @  1.8.2009,  16:45 Найти цитируемый пост)
Таким, которые вас удовлетворят - нет.

Ну тогда к чему были ваши заявления об обучении? Если вы хотели "блеснуть талантом", то у вас не вышло, а тот факт, что человек кот. получает до 5 килобаксов за проект сейчас хочет заниматься репетиторством по скайпу наводит на мысли, что не все в порядке в "датском королевстве". К вам пришел кризис? Перепрофилируетесь? Если да, то есть более "рентабельные" виды услуг по телефону ;)

Цитата(nerezus @  1.8.2009,  16:45 Найти цитируемый пост)
Неверно. Прогон синтетического кол-ва раз задачи не сможет дать представления о том, как это будет в реальной задаче.

Совершенно с Вами согласен. Только в теме не говорилось о реальной задаче. Или "рИальные пацики" рИшают только "рИальные задачи"?

Цитата(krundetz @  1.8.2009,  20:14 Найти цитируемый пост)
для нормального эксперимента советую иметь законченый проект и прогнать его через дебагер.

как раз из дебагера этот вопрос и возник, а серьезный проект законченным быть не может: ты либо догоняешь конкурентов, либо, если таки догнал, должен быть на шаг впереди, а для этого нужно постоянно развиваться, что никак не коррелируется с законченностью

Цитата(krundetz @  1.8.2009,  20:14 Найти цитируемый пост)
Оптимизировать до получения готового проекта бессмыслено так как неизвестно что нужно оптимизировать!

очень красивый цвет и очень крупный шрифт: +1, осмелюсь еще посоветовать в следующий раз нажать CapsLock перед набором текста ;)
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Ипатьев
Дата 2.8.2009, 12:47 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Слишком многословные оправдания. 
И постоянные попытки наезда. Я здесь недавно, но по-моему здесь так не принято.


Это сообщение отредактировал(а) Ипатьев - 2.8.2009, 12:50
PM MAIL   Вверх
WIPS
Дата 2.8.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 1
Всего: 8



Цитата(Ипатьев @  2.8.2009,  11:47 Найти цитируемый пост)
Слишком многословные оправдания.

Оправдания, ну вы насмешили  smile 
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.