Как да сравня средното време на изпълнение на две функции в MySQL?

Исках да сравня средното време на изпълнение на две функции в MySQL -

Квадратно разстояние: pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2)

vs

Точка продукт: x1 * x2 + y1 * y2 + z1 * z2

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

И така, опитах профилиране. Ето какво имам,

mysql> show profiles;
+----------+------------+-----------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                 |
+----------+------------+-----------------------------------------------------------------------+
|        4 | 0.00014400 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        5 | 0.00012800 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        6 | 0.00017000 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        7 | 0.00024800 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        8 | 0.00014400 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        9 | 0.00014000 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|       10 | 0.00014900 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|       11 | 0.00015000 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       12 | 0.00012000 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       13 | 0.00015200 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       14 | 0.00022500 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       15 | 0.00012700 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       16 | 0.00013200 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       17 | 0.00013400 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       18 | 0.00013800 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
+----------+------------+-----------------------------------------------------------------------+
15 rows in set, 1 warning (0.00 sec)

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

Трябва да стартирам всяка от тези функции около 10 000 пъти, за да получа хубаво и последователно средно време на изпълнение. Как да постигна това в MySQL?

(Имайте предвид, че rand() се извиква 6 пъти и в двете функции, така че времето за изпълнение всъщност не прави разлика)

Редактиране:

Разбира се, мога да създам временна таблица, би било малко неудобно, да я попълня с произволни стойности, което отново не е ясно (вижте Как попълвам mysql таблица с много произволни числа) и след това продължете със сравняването на моите функции.

Исках да знам дали съществува по-добър начин в MySQL.


person Optimus    schedule 08.11.2014    source източник
comment
Може би можете да създадете таблица A само с една колона, наречена c, и да вмъкнете 50 000 000 записа, след което да изберете rand()*rand()+rand()*rand()+rand()*rand() като c0, A.c от; този избор ще изчисли 50 00 000 пъти, може би ще ви помогне.   -  person coo    schedule 08.11.2014
comment
@coo редактирах въпроса си   -  person Optimus    schedule 08.11.2014
comment
Не е неудобно. Само с кратка програма, вмъкнете с цикъл. Не е необходимо да поставяте на ръка.   -  person coo    schedule 08.11.2014
comment
Вие не профилирате вашата функция за разстояние, вие профилирате rand! И наистина ли има смисъл да се сравняват изрази, които изчисляват различни неща?   -  person Yves Daoust    schedule 08.11.2014
comment
@YvesDaoust Има смисъл да ги сравняваме, тъй като за две точки на земята (сфера) минимизирането на квадратното разстояние е еквивалентно на максимизиране на точковия продукт, 2 точки с 0 разстояние между тях имат максимален точков продукт R*R. Така че имам избор, независимо от това как мога да направя заявката...   -  person Optimus    schedule 08.11.2014
comment
Ако работите върху 2D колектор, не е ли възможно да работите с 2 координати на точка вместо с 3?   -  person Yves Daoust    schedule 08.11.2014
comment
Имам географски ширини и дължини на точки, но изчисляването на разстояния между тях изисква много тригонометрични функции, което би било много бавно. Сравняването на евклидово разстояние между тях не работи по полюсите или където географската дължина е около 180 или -180. Не можах да измисля друг начин за намаляване на броя на координатите, като същевременно избягвам тези проблеми. Кажете ми, ако можете да измислите някакъв начин...   -  person Optimus    schedule 09.11.2014


Отговори (1)


В най-добрия от случаите функцията pow открива, че експонентата е цяло число 2 и извършва степенуване с едно умножение. Няма причина да може да победи чисто умножение.

person Yves Daoust    schedule 08.11.2014
comment
Ако вашето приложение е толкова интензивно изчислително, по-добре потърсете алгоритъм, който има по-добра асимптотична сложност. - person Yves Daoust; 08.11.2014
comment
Опитах предложението на coo и да, точковият продукт е 1,4 пъти по-бърз средно... но е неудобно да създавате цяла таблица и да я пълните с произволни числа всеки път, когато искате да замерите време за различна функция... Изглежда няма друг начин... - person Optimus; 08.11.2014
comment
Опитайте се да преминете към алгоритъм с по-ниска асимптотична сложност. - person Yves Daoust; 08.11.2014