LINUX.ORG.RU

Снова немного PHP и Wordpress: это бенч?

 , ,


0

1

Всем привет!

Намедни один мой знакомый спросил меня, насколько адекватны оценки производительности плагина WP Hosting Benchmark Tool.

Полез я в файлы плагина и, среди прочего, обратил внимание на такой код

function test_db_joins() {
		global $wpdb;

		$this->init_dbtable_names();

				
		for ($i=0;$i<50;$i++) {
			#$wpdb->get_results("select ".$this->dbtables["obj"].".o_id, ".$this->dbtables["prop"].".p_name, ".$this->dbtables["log"].".txt from ".$this->dbtables["obj"]." left join ".$this->dbtables["prop"]." on ".$this->dbtables["obj"].".o_id=".$this->dbtables["prop"].".o_id left join ".$this->dbtables["log"]." on ".$this->dbtables["prop"].".p_id=".$this->dbtables["log"].".p_id where ".$this->dbtables["obj"].".o_id=".rand(1,999)." and ".$this->dbtables["prop"].".p_name='name'");

			
			$sql = "select ".$this->dbtables["obj"].".o_id, ".$this->dbtables["prop"].".p_name, ".$this->dbtables["log"].".txt from ".$this->dbtables["obj"]." left join ".$this->dbtables["prop"]." on ".$this->dbtables["obj"].".o_id=".$this->dbtables["prop"].".o_id left join ".$this->dbtables["log"]." on ".$this->dbtables["prop"].".p_id=".$this->dbtables["log"].".p_id where ".$this->dbtables["prop"].".p_name like '%".$this->random_string(2)."%' order by RAND() limit 1;";
			$wpdb->get_results($sql);
		}


		for ($i=0;$i<50;$i++) {
			$sql = "select ".$this->dbtables["prop"].".p_id, ".$this->dbtables["prop"].".p_name, ".$this->dbtables["log"].".txt from ".$this->dbtables["log"]." left join ".$this->dbtables["prop"]." on ".$this->dbtables["log"].".p_id=".$this->dbtables["prop"].".p_id where ".$this->dbtables["prop"].".p_data like '%".$i."%' order by ".$this->dbtables["log"].".txt, ".$this->dbtables["prop"].".p_id desc limit 50;";
			$wpdb->get_results($sql);
		}

	}

Поскольку от строк выше в глазах нехорошо и читабельность не очень, решил обратиться к практикам: нормален ли этот код для оценки производительности операций объединения?

★★★★★

Последнее исправление: Twissel (всего исправлений: 2)

нормален ли этот код для оценки производительности

Так сам код, или оценка с помощью такого кода? Код страшненький, но для одноразового сойдёт. Джойны как джойны, какую-то метрику в попугаях ты получишь, т.е. само с собой сравнивать можно. Насколько результаты будут адекватны твоим запросам зависит больше от твоих запросов.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Так сам код, или оценка с помощью такого кода?

Оценка.

В теории, при каких обстоятельствах бенч может занизить оценку/дать несоответствующую действительности.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Это понятно, но к автору плагина.

Топик не об этом.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

при каких обстоятельствах

Когда мускуль закеширует.

deep-purple ★★★★★
()

нормален ли этот код для оценки производительности операций объединения?

Нет. Он измеряет производительность like '%...%'. Плагин - сранина, как и весь остальной wp.
И вообще, лог пустой, бд пустая - результаты бенча всегда отличные. Кусок дерьма одним словом.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 3)
Ответ на: комментарий от crutch_master

лог пустой, бд пустая - результаты бенча всегда отличные.

Не понял, ты тестировал на пустой БД?

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Не понял, ты тестировал на пустой БД?

А нахера? И так из запроса понятно, что если лог пустой, то выборка будет маленькая и работать будет очень быстро. А если нет, то по каждой записи будет делаться не очень быстрый like '%...%' и встанет вопрос, а что, собственно измеряем.

crutch_master ★★★★★
()
Ответ на: комментарий от Twissel

несоответствующую действительности

Тест использует типичные джойны для WP, в т.ч. и like %% часто встречается. Именно своей говнокодностью он адекватен, как ни странно. Можно робко надеяться что у других (говно)плагинов будет схожая производительность. Т.е. я бы не рассматривал тест как именно тест базы, скорее как тест работы с базой из WP на типичной нагрузке.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Самое, что удивляет, а зачем вообще бенчить? И так понятно, что это говно не может не тормозить на хоть сколько-нибудь серьёзной нагрузке.

crutch_master ★★★★★
()
Ответ на: комментарий от no-such-file

Скорость работы типичного говнокода.

Так, ваясн почистит лог и он ничего не измерит.

crutch_master ★★★★★
()
Ответ на: комментарий от no-such-file

на засыпку

function test_db_insert() {
		global $wpdb;

		$this->init_dbtable_names();

		$this->clean_db_test_tables();

		# create test tables
		$this->create_db_test_tables();

		$object_types = array("ocean", "mountain", "space", "earth");
		$object_properties = array("name", "size", "value", "data1", "data2");

		# generate 10 random strings to use
		$random_data = array();
		$random_binary = "";
		for ($j=0;$j<10;$j++) {
			for($r=0;$r<30;$r++) {
				$random_binary.=$this->random_string(1024);
			}
			$random_data[$j]=$random_binary;
		}

		$next_o_type = 0;

		for($o=1;$o<=1000;$o++) {
			$wpdb->insert(
				$this->dbtables["obj"],
				array(
					"random_int"=>rand(1,1000),
					"object_name"=>"Object ".$o,
					"object_type"=>$object_types[$next_o_type]
				)
			);
			$o_id = $wpdb->insert_id;

			$this->insert_into_db_testlog("Created new object, nr ".$o, $o_id);

			foreach($object_properties as $p) {
				$wpdb->insert(
					$this->dbtables["prop"],
					array(
						"o_id"=>$o_id,
						"p_name"=>$p
					)
				);
				$p_id = $wpdb->insert_id;

				$this->insert_into_db_testlog("Created property ".$p." for o_id=".$o_id, $o_id, $p_id);

				if ($p=="name") {

					$tmp_data = $wpdb->get_results("select object_name from ".$this->dbtables["obj"]." where o_id=".$o_id.";", ARRAY_A );

					if (count($tmp_data)>0) {
						$set_value = $tmp_data[0]["object_name"];
					} else {
						$set_value = "uknown name";
					}

				} else if ($p=="data1" || $p=="data2") {
					
					$set_value = $random_data[($o%10)];

				} else {
					$set_value = rand(10,1000);
				}

				$wpdb->update($this->dbtables["prop"], array("p_data"=>$set_value), array("p_id"=>$p_id));
				$this->insert_into_db_testlog("Updated property ".$p." with a value", $o_id, $p_id);
			}

			$next_o_type++;
			if ($next_o_type>3)
				$next_o_type=0;
		}
	}

Тут, на первый взгляд, тоже все просто, но на большей БД и настроенном MySQL (mysqltuner) этот код показывает меньше попугаев, чем на небольшой БД с дефолтными настройками.

Ничего не навангуете? ))

Twissel ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

ну в php область видимость не так работает как в нормальных языках:


$a = 42;

function f() {
  echo $a;
}

foo(); // ошибка

Обычно в $GLOBALS пихают либо его самопальный аналог типа класса Reigistry.

Можно и такое что-нибудь использовать:

<?php

function config($k, $v = null) {
  static $data = [];
  if (func_num_args() > 1) { 
    $data[$k] = $v;
  }
  return $data[$k];
}

config('foo', 'bar');
echo(config('foo'));

Но по-сути этож тож самое. Просто какое-то рачье, которое переползло в пхп со своей жООП-религией решило иначе. В результате похапэшники терь на паттерны надрачивают, которые в скриптовых языках нужно чуть чаще чем никогда. Ты сам-то код Wordpress видел? Он весь в таком стиле. Обычный процедурный стиль. В этом есть смысл, потому как порог вхождения разработчиков опускает до самого дна и любой дурак может написать свой плагин. В итоге мы имеет десятки тысяч плагинов, что сделало вротпресс самым популярным. Ну то что там вид от представления не отделяется и т.д. а когда-нибудь кому-нибудь потребуется вообще отдавать страницу не в хтмл? Понимаю там у апишек данные могут отдавать в JSON либо XML (но от этой моды уже повсеместно отошли). Человек сидящий на Линуксе, которрый состоит из говна и палок не имеет права критиковать вротпресс, который что ни на есть Unix-way.

tz4678 ★★
()
Ответ на: комментарий от tz4678

Для начала — знатно ты набросил! Мне очень понравилось.

в php область видимость не так работает

Я знаю как она в пхп работает.

какое-то рачье

Ну дык — это переползшее рачьё и пишет global при живом $this. Поясняю: по $this понятно из контекста, что эта функция есть метод класса. Этот рак тут на оба стула сел. Надо было (или/или):

а) написать функцию, не метод объекта, а просто функцию, в которой будет global или костыли тобой перечисленные

б) убрать global, передать в конструктор объекта нужный контекст, в данном случае, что понятно из куска кода — коннект к БД или типа того, что в итоге будет доступно как $this->wpdb.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)

А в чем смысл этого бенчмарка? Проверить скорость конкатенации строк в php и производительность MySQL? Это ж вообще бессмысленно.

dimuska139 ★★
()
Ответ на: комментарий от tz4678

который что ни на есть Unix-way

Пишите программы, которые делают что-то одно и делают это хорошо.

Где программы? Где хотя бы изоляция модулей?
Кто в wp делает что-то *одно*?
Кто в wp делает хоть что-то хорошо?

Забанься короче, будь мужиком. Только так ты сможешь смыть этот позор.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от dimuska139

Вот. WP еще «хорош» тем, что притягивает к себе всякий бездарный сброд, который еще и пытается заработать продавая свои поделки.

crutch_master ★★★★★
()
Ответ на: комментарий от tz4678

Ну и главное Open Source. Вротпресс всему этому соответствует.

tz4678 ★★
()
Ответ на: комментарий от tz4678

Скучно набрасываешь в теме про php.

Не взлетит)

Twissel ★★★★★
() автор топика
Ответ на: комментарий от tz4678

Unix-way ‒ копипаста в коде, отсутствие тестов и говнокод! Кокококо.

Потому что ты так решил? Утопись в тазике.

Ядро Linux именно так и написано!!!

Поехавший. Unix-way это coreutils, например. Ядро линукс в каком месте unix-way?
Где ответы на заданные вопросы?

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от dimuska139

Судя по названию бенча он тестирует не джойны и бд, а производительность хостинга, путем построения максимально неоптимизируемого запроса (поэтому в запросе всякие order by random, like и прочее). Запрос не закэшировать, по таблице он fullscan’ом проходится, поэтому +/- функцию свою должен выполнять.

nguseff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.