Страница 9 из 12
Re: Строим графики Highstock
Добавлено: Чт мар 09, 2017 11:30 pm
Bagir
Нарыл таки я способ как получить нужный нам JSON.
Код: Выделить всё
// Получить имя и проверить
if ( isset($params['name']) ) { $name = $params['name']; } else { returm; }
// Разбить на объект и свойство
$name = explode('.', $name);
// Получить объект по имени
$obj=getObject($name[0]);
// Получить id свойства
$prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id);
// Получаем VALUE_ID для таблицы истории
$pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'");
// Получаем данные из таблицы истории
$arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED");
// Собрать структуру JSON
$st = $params['callback'].'([';
$f = false;
foreach($arr_s as $s) {
if ($f) { $st .=','; } else { $f = true; }
$st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']' ;
}
$st .= '])';
// Ответ
echo ($st);
Код: Выделить всё
// Получить имя и проверить
if ( isset($params['name']) ) { $name = $params['name']; } else { returm; }
// Разбить на объект и свойство
$name = explode('.', $name);
// Получить объект по имени
$obj=getObject($name[0]);
// Получить id свойства
$prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id);
// Получаем VALUE_ID для таблицы истории
$pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'");
// Получаем данные из таблицы истории
$arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED)*1000 as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED");
// Собрать структуру JSON
$st = $params['callback'].'('.json_encode(array_map(array_values, $arr_s), JSON_NUMERIC_CHECK).')';
// Ответ
echo ($st);
Ответы полностью одинаковые. Кто умеет, сделайте сравнительный анализ быстродействия. Очень интересно, какой способ быстрее. Особые надежды на второй вариант я не возлагаю. array_map наверное прожорливая штучка. Но в тоже время в первом варианте очень много операции сложение текста с очень длинной строкой. Так что без испытаний я не могу сказать кто победит.
Re: Строим графики Highstock
Добавлено: Пт мар 10, 2017 9:36 am
Ko/|xo3HUk
Придумал потестить скрипт только так: создал два сценария, в которых прописал следующее:
Код: Выделить всё
$start = microtime(true);
{здесь вставил сценарий_1, только последнюю строку [echo ($st); ] закомментарил, чтобы лишнего на экран не выводило}
//echo ($st);
$finish = microtime(true);
$delta = $finish - $start;
echo 'Время выполнения php скрипта в микросекундах: '. $delta . ' сек.';
Код: Выделить всё
$start = microtime(true);
{здесь вставил сценарий_2, только последнюю строку [echo ($st); ] закомментарил, чтобы лишнего на экран не выводило}
//echo ($st);
$finish = microtime(true);
$delta = $finish - $start;
echo 'Время выполнения php скрипта в микросекундах: '. $delta . ' сек.';
И запускал эти скрипты следующим образом: в адресной строке браузера вставлял адрес:
для первого сценария:
Код: Выделить всё
http://192.168.1.69/objects/?script=js_test1&name=ESP8266_Outside.Temper_1
для второго:
Код: Выделить всё
http://192.168.1.69/objects/?script=js_test2&name=ESP8266_Outside.Temper_1
где, ESP8266_Outside.Temper_1 - переменная, куда пишется температура на улице. Пишется с 11 декабря 2015 года, с интервалом в 1 минуту.
Запускал скрипт по 20 раз. Получились в итоге вот такие цифры:
для сценария_1:
7,03787303
5,184198141
6,219690084
5,426856995
9,406219006
7,841920137
7,057847023
5,6811409
5,919893026
6,546282053
6,701434135
5,970079184
8,49712491
9,361844063
8,728251934
5,736598015
5,904496908
18,10865498
9,478587151
16,449404
----------------------
Среднее значение = 8,062919784 сек.
для сценария_2:
5,893275023
10,16350508
10,34498191
7,576536894
6,416634798
5,251133919
5,726686001
6,050065994
7,540504932
5,912469149
6,208261967
15,30325508
8,373816967
6,140471935
9,740535021
9,613977909
21,98826194
6,682202101
11,67304397
6,910239935
----------------------
Среднее значение = 8,675493026 сек.
Чисто субъективно - сценарий_1 пошустрее работает. Но всё-равно значения в каждом тесте сильно разнятся - зависит, видимо, больше от того - насколько загружен сейчас проц сервера другими задачами.
Re: Строим графики Highstock
Добавлено: Пт мар 10, 2017 9:53 am
Bagir
Да, нужно среднее высчитывать после нескольких запусков. Кроме сборки JSON многое зависит от реакции SQL. Но полученные цифры весьма многое говорят. Значит остаемся на первом варианте. Я немного изменил его по сравнению с примером на первом посте. В выходные оформлю.
Re: Строим графики Highstock
Добавлено: Пт мар 10, 2017 9:57 am
Ko/|xo3HUk
Решил поинтересоваться - насколько быстрее будет выполняться скрипт, если ограничить диапазон выборки всего за один месяц:
Код: Выделить всё
$start = microtime(true);
//echo 'Время начала выполнения php скрипта в микросекундах: '. $start . ' сек.';
// Получаем текущее время:
$end_time=time();
$start_time = $end_time-31*24*60*60; // 1 месяц
// Получить имя и проверить
if ( isset($params['name']) ) { $name = $params['name']; } else { returm; }
// Разбить на объект и свойство
$name = explode('.', $name);
// Получить объект по имени
$obj=getObject($name[0]);
// Получить id свойства
$prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id);
// Получаем VALUE_ID для таблицы истории
$pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'");
// Получаем данные из таблицы истории
// $arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED");
$arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>=('".date('Y-m-d H:i:s', $start_time)."') AND ADDED<=('".date('Y-m-d H:i:s', $end_time)."') ORDER BY ADDED");
// Собрать структуру JSON
$st = $params['callback'].'([';
$f = false;
foreach($arr_s as $s) {
if ($f) { $st .=','; } else { $f = true; }
$st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']' ;
}
$st .= '])';
// Ответ
//echo ($st);
$finish = microtime(true);
$delta = $finish - $start;
echo 'Время выполнения php скрипта в микросекундах: '. $delta . ' сек.';
Вот в итоге какие цифры получились:
2,660046101
1,288882017
1,056625128
1,317773104
18,16537905
1,894510031
2,801804066
1,680463076
3,049397945
2,236911058
3,544475079
8,996900082
0,81338501
1,403491974
1,155987978
3,382887125
1,120095015
17,04177904
5,479170084
1,126164913
----------------
Среднее значение = 4,010806394 сек.
Здесь наглядно видно что в какие-то моменты времени проц очень занят - прирост времени в 1000%
Re: Строим графики Highstock
Добавлено: Пт мар 10, 2017 10:16 am
Bagir
Вообщем, как не жаль, а выше головы не прыгнешь. Поборемся конечно еще на оптимизацию. Может какие новые идеи будут.
Данных реально очень много, и быстро их не обработать. Значит будем работать со вторым направлением. С нашей базой данных. С точки зрения индексов по моему она совершенна. И тут уже нечего добавить. Нам остается только обязательно оптимизировать её, чтобы не было одинаковых значений. Если хочется, чтобы шкала времени была всегда линейная, то для этого есть специальный параметр. Тут о нём уже ранее говорили. Я выложу его в пример на первом посте.
Highstock сейчас использую тоже новой версии. Замеры на скорость отрисовки не проводил, но на скидку уж точно не хуже.
Ещё можно подумать над самой структурой. Например, у меня температура пишется сразу в объект датчик с историей 7 дней. Пишется при любом, даже самом малом изменении. По этим данным я могу точно вычислить, возрастает или убывает показания датчика.
Затем, при изменении температуры объекта датчика, значение передается объекту комнаты. Тут уже не так критично, и пишу уже с точностью 1 градус. Это сильно округляет данные и уменьшает объем. Объект комнаты хранит данные уже два года. По объектам комнат уже и строю графики температур.
Кстати, такая схема позволяет организовать дублирующие датчики для объекта комнаты. Например, когда основной датчик "захворал", но у нас есть ещё один источник данных температуры в этой комнате.
Re: Строим графики Highstock
Добавлено: Пт мар 10, 2017 6:51 pm
Victor_S
Может кто подсказать по графикам highstok, в чем проблема?
viewtopic.php?p=47426#p47426
Re: Строим графики Highstock
Добавлено: Пт мар 10, 2017 7:19 pm
Ko/|xo3HUk
Вы там спрашивали как масштаб "All" по умолчанию вывести - ищите в коде:
Код: Выделить всё
rangeSelector: {
buttons: [ { type: 'hour', count: 1, text: '1h' },
{ type: 'hour', count: 6, text: '6h' },
{ type: 'day', count: 1, text: '1d' },
{ type: 'day', count: 2, text: '2d' },
{ type: 'week', count: 1, text: '1w' },
{ type: 'month', count: 1, text: '1m' },
{ type: 'month', count: 6, text: '6m' },
{ type: 'year', count: 1, text: '1y' },
{ type: 'all', text: 'All' }],
selected: 2 // Какая кнопка выбрана по умолчанию
},
вот "selected: 2" как раз и отвечает - какой масштаб будет по умолчанию.
Re: Строим графики Highstock
Добавлено: Вс мар 12, 2017 6:27 pm
Victor_S
Ko/|xo3HUk, там же я писал о том, что "игрался" с этим параметром, но безрезультатно...
Re: Строим графики Highstock
Добавлено: Вс мар 12, 2017 7:09 pm
Ko/|xo3HUk
Сорри, прочитал по диагонали, не увидел про "selected". Без кода графика сложно говорить что-либо.
Re: Строим графики Highstock
Добавлено: Пн сен 04, 2017 9:48 am
Sapizdullin
Кто направит на путь истинный?
Создаю
Bagir писал(а):
2. Создайте новый сценарий с именем jconhs
пытаюсь запустить - error 500 сервера и аля улю..