BG Development


Страници: (3) [1] 2 3   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Скорост между array_filter и директен достъп
relax4o
Публикувано на: 20-04-2019, 13:53
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2485
Регистриран на: 04.04.07



Току що се озадачих върху следните измервания, които направих.

Ще се радвам, ако някой обясни защо така се получава или въобще, аз ли измервам неправилно.

Имам следния масив от 20000+ елемента. Структурата му наподобява следната:

CODE

Array
(
      [1041] => Array
      (
          [cgroup] => Array
              (
                  [external_id] => 1041
                  [firm_id] => 270
                   // Тука още стойности
              )

          [people] => Array
              (
                  [0] => Array
                      (
                          [group_id] => -1
                            // Тука още стойности
                      )
              )
      )
)


Всяко ID отговаря на cgroup.external_id. Преди го нямаше, но реших, че може би ще подобри скорост, но излиза, че е по-бавно или се залъгвам.

Ето и как измервам времената:

CODE

$cRef = $action['cRef'];

$startTime = microtime(true);

$contact = $contacts[$cRef];   // Това трябва да е O(1)

$end = microtime(true);

echo "1. " . ($end - $startTime) . PHP_EOL;

///////////////////////////////////////////////////////////

// Това е стария начин, когато ключовете на масива ги нямаше(бяха зададени автоматично)
$startTime = microtime(true);
$contact = array_filter($contacts, function ($item) use ($cRef) {   // А това O(n)
    return $item['cgroup']['external_id'] == $cRef;
});
$contact = current($contact);
$end = microtime(true);

echo "2. " . ($end - $startTime) . PHP_EOL;



Това са резултатите:

CODE

1. 4.0531158447266E-6
2. 0.19215202331543


Всичко това е в един цикъл, и на всяка итерация се прави.

Аз ли измервам грешно или.. ? Не мога да си обясня защо array_filter би бил по-бърз.
Кода върви под PHP 5.6 cli.




--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
SuN
Публикувано на: 20-04-2019, 14:05
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 9613
Регистриран на: 27.01.05



Цитирам популярна фраза по спомен: има два трудни проблема в компютърните науки - да се кръщават неща и изчистване на кешовете.

Така като гледам втория код тръгва веднага след първия и не се знае колко от данните са се нагъчкали в кеша на процесора висок клас, който си купил, защото ти е по-евтино в чужбина.


--------------------
Само аз не троля.
Всички коментари са плод на художествена измислица и нямат общо с действителни и недействителни лица, събития и факти.
PMEmail Poster
Top
relax4o
Публикувано на: 20-04-2019, 14:24
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2485
Регистриран на: 04.04.07



Не е това проблема, защото ги тествах индивидуално.

Очевидно измерването ми е грешно. Тествах по различен начин като измервам целия процес вместо поединично и резултатите са доста по-правилни:

Директен достъп:
CODE

 Total number of contacts = 20063
 Creating property
 Adding actions...
Time: 0.0015900135040283
 Creating property
 Adding actions...
Time: 0.0017590522766113
 Creating property
 Adding actions...
Time: 0.0010359287261963


array_filter
CODE

 Total number of contacts = 20063
 Creating property
 Adding actions...
Time: 4.9529078006744
 Creating property
 Adding actions...
Time: 5.2411050796509
 Creating property
 Adding actions...
Time: 2.2542071342468




Относно "евтиния хардуер, който съм си купил", не знам какво общо има, но звучиш засегнат от предишна дискусия.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
SuN
Публикувано на: 20-04-2019, 14:37
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 9613
Регистриран на: 27.01.05



QUOTE
Относно "евтиния хардуер, който съм си купил", не знам какво общо има, но звучиш засегнат от предишна дискусия.

Или така звуча, или беше намек, че от това, което си дал нещата изглеждат като една програма:
CODE
НАЧАЛО НА ЦИКЪЛ
1. твоя код за мерене на директен достъп
2. твоя код за мерене на филтъра
КРАЙ НА ЦИКЪЛ

От което следват едни изводи вследствие на улеснения достъп до високо-скоростни машини, за които джонката редовно ги обяснява как програмистите трябва да пишат на бавен хардуер. Даже не знам, защо си мислиш, че коментара ми беше директно към теб...

Това мнение е било редактирано от SuN на 20-04-2019, 14:37


--------------------
Само аз не троля.
Всички коментари са плод на художествена измислица и нямат общо с действителни и недействителни лица, събития и факти.
PMEmail Poster
Top
relax4o
Публикувано на: 20-04-2019, 15:06
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2485
Регистриран на: 04.04.07



Дадох ги на куп, но ги тествах и поотделно.

И все пак, измерването ми беше грешно. По този начин явно не може да се гарантира, че microtime() ще даде правилен резултат.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
Gluhiqdev
Публикувано на: 20-04-2019, 23:06
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 11
Регистриран на: 13.04.19



Погледни това:
https://phpbench.com

Направили са доста подробни тестове на основните оператори.

PMEmail Poster
Top
purjola
Публикувано на: 21-04-2019, 01:09
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2362
Регистриран на: 18.10.11



QUOTE (relax4o @ 20-04-2019, 16:06)
Дадох ги на куп, но ги тествах и поотделно.

И все пак, измерването ми беше грешно. По този начин явно не може да се гарантира, че microtime() ще даде правилен резултат.

usleep(100)

Все още има бъг и трябва пауза преди да записваш $end = microtime(true)
PMEmail Poster
Top
relax4o
Публикувано на: 21-04-2019, 03:04
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2485
Регистриран на: 04.04.07



QUOTE (Gluhiqdev @ 20-04-2019, 23:06)
Погледни това:
https://phpbench.com

Направили са доста подробни тестове на основните оператори.

Мен в случая не ме интересуваше да намеря най-оптималния вариант, защото го имах. На мен ми трябваше да разбера защо ми показваше грешен резултат. Едното е O(1), другото е O(n) (даже изглежда не е точно O(n)).


@purjola благодаря. Не бях запознат с този бъг. Всичко изглежда точно сега, с паузата.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
Gamma Goblin
Публикувано на: 21-04-2019, 07:45
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3019
Регистриран на: 21.02.18



QUOTE (relax4o @ 20-04-2019, 13:53)

Имам следния масив от 20000+ елемента.

Ти не мина ли на джава ? Или те бъркам с някой ?


--------------------
https://www.rust-lang.org/
---
" Не може да си на висок пост без да си подкупен. Ще те махнат." - SuN Трола
PMEmail PosterUsers Website
Top
relax4o
Публикувано на: 21-04-2019, 11:54
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2485
Регистриран на: 04.04.07



QUOTE (Gamma Goblin @ 21-04-2019, 07:45)
QUOTE (relax4o @ 20-04-2019, 13:53)

Имам следния масив от 20000+ елемента.

Ти не мина ли на джава ? Или те бъркам с някой ?

Не ме бъркаш, но малко дадох назад с Java-та.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (3) [1] 2 3  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0