Интересные задачи для программистов

T7
На сайте с 19.09.2018
Offline
63
#31
danforth:
На пыхе кстати можно декодер через yield завернуть, возможно будет быстрее

Может, но что что то существенное генератором выиграем сомнительно. Тут ресурсов 0 да маленько (0.36/2 (memory_get_usage/memory_get_peak_usage)).

Где можно выиграть. По операциям:

На коленке за 10 мин 35 строк кода:


test
json_decode x 10000: 16.0880 ms

json_encode x 3000: 4.3969 ms

file_append [ (json x 10 x 00) ]: 5.7662 ms

file_append [ (json x 3000) ]: 55.0900 ms

Кроме читать блоками (где 50-60мс), потенциал, только в месте записи. Не 3000 раз file_put_contents($file, $dd, FILE_APPEND);

а, например 300, но 10 найденных разом. В первом варианте у меня записи не было, в во втором, который с посложнее jsonами пачками по 500 найденных

Я все таки сторонник того что, json надо раскодировать, поэтому 10000 раз разобрать придется. Это дает гибкость и универсальность.

$d = '

{
"id": 47704,
"scores": 0.7003193510956659
}';
$t0 = microtime(true);
for($i=0;$i<10000;$i++){
$j = json_decode($d);
}
echo sprintf("json_decode x 10000: %01.4f ms",
(microtime(true) - $t0) * 1000), "\n\n";

print_r($j);
$t0 = microtime(true);
for($i=0;$i<3000;$i++){
$s = json_encode($j);
}
echo sprintf("json_encode x 3000: %01.4f ms",
(microtime(true) - $t0) * 1000), "\n\n";

$dd = str_repeat ( $d , 10 );
$file = '/var/web/aio/data/json-22';
$t0 = microtime(true);
file_put_contents($file, '['); for($i=0;$i<300;$i++){
file_put_contents($file, $dd, FILE_APPEND);
}
file_put_contents($file, ']', FILE_APPEND);
echo sprintf("file_append [ (json x 10 x 00) ]: %01.4f ms",
(microtime(true) - $t0) * 1000), "\n\n";

$t0 = microtime(true);
file_put_contents($file, '['); for($i=0;$i<3000;$i++){
file_put_contents($file, $d, FILE_APPEND);
}
file_put_contents($file, ']', FILE_APPEND);
echo sprintf("file_append [ (json x 3000) ]: %01.4f ms",
(microtime(true) - $t0) * 1000), "\n\n";

exit();
HM
На сайте с 14.01.2012
Offline
223
#32
danforth:
Почему не согласны?

Потому что надо брать не простую строку в 50 символов, а что-то большее;

дальше стер, потому что я не программист и спорить лень.

---------- Добавлено 15.06.2020 в 21:51 ----------

danforth:
Тут не в сотый,

Тут не в сотый, а на условном SO в сотый. Высосали задачу из пальца и пишете новое решение, хотя все давно написано и либы давно есть.

Если уж совсем прямо, то у sly32 бомбануло от уровня этого раздела форума (что логично, учитывая двух долбоебов sevlad и sitealert) и он решил начать меряться кодом. Но я думаю (да вы и сами знаете), что это не тот форум для такого уровня.

T7
На сайте с 19.09.2018
Offline
63
#33
hakuna matata:
Высосали задачу из пальца и пишете новое решение, хотя все давно написано и либы давно есть.

К теме относиться надо как разминка, тем кому интересно. Ну и обмен мнениями, для тех кто not

hakuna matata:
что я не программист

А так, вот смотрите:

hakuna matata:
Их в гугле полно https://github.com/salsify/jsonstreamingparser

"require": {

"php": "^7.2",
"twig/twig":"^2.0",
"box/spout": "^3.0",
"endroid/qr-code":"*",
"salsify/json-streaming-parser":"*"
},

Впендюриваем

header('content-type:text/plain');

$testfile = '/var/web/aio/data/json';
$listener = new \JsonStreamingParser\Listener\InMemoryListener();

logger( 'Before JsonStreamingParser\\Parser ' );
print_r( end($GLOBALS['aapp_timing'] ));
$stream = fopen($testfile, 'r');
try {
$parser = new \JsonStreamingParser\Parser($stream, $listener);
$parser->parse();
fclose($stream);
} catch (Exception $e) {
fclose($stream);
throw $e;
}
logger( 'After JsonStreamingParser\\Parser ' );
print_r( end($GLOBALS['aapp_timing'] ));

var_dump($listener->getJson());

Оно еще ничего не делало, ($listener->getJson() после логгера), просто инициализировалось, но добавило 243.5660(ms) и 4+ метра

Array

(
[msg] => Before JsonStreamingParser\Parser
[afterstart] => 3.1090(ms)
[afterprevios] => 0.0880(ms)
[mem_peak] => 0.51/2.00(mb)
)
Array
(
[msg] => After JsonStreamingParser\Parser
[afterstart] => 246.6750(ms)
[afterprevios] => 243.5660(ms)
[mem_peak] => 5.21/4.00(mb)
)
array(10000) {
[0]=>
array(2) {
["id"]=>
int(21675)
["scores"]=>
float(0.27687288427211)

Код функции логгер:

function logger( $message )

{
if(!_DEBUG) return 0;
if( !array_key_exists( 'aapp_timing', $GLOBALS ) ) {
$GLOBALS['aapp_timing'] = [];
$last = $GLOBALS['aapp_last_timing'] = _STIME;
} else $last = $GLOBALS['aapp_last_timing'];
$t1 = microtime(true);
$m = (memory_get_usage() / 1024) / 1024;
$mp = (memory_get_peak_usage(true) / 1024) / 1024;
$m = sprintf("%01.2f/%01.2f(mb)", $m, $mp);
$GLOBALS['aapp_timing'][] = [ 'msg' => $message,
'afterstart' => __timer( $t1, _STIME ),
'afterprevios' => __timer( $t1, $last ),
'mem_peak' => $m
];
$GLOBALS['aapp_last_timing'] = $t1;
}
png hakuna.png
T7
На сайте с 19.09.2018
Offline
63
#34
hakuna matata:
что это не тот форум для такого уровня.

Так уровень надо повышать. Так что тема годная.

danforth
На сайте с 18.12.2015
Offline
153
#35
hakuna matata:
Потому что надо брать не простую строку в 50 символов, а что-то большее;

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

hakuna matata:
Тут не в сотый, а на условном SO в сотый. Высосали задачу из пальца и пишете новое решение, хотя все давно написано и либы давно есть.

Либы под много что есть, было бы глупо создать тему, где каждый бы подключал либу и делал вызов одной функции. Суть темы прокачать скилл и пообщаться на тему кода и разработки (что мы и делаем, в принципе).

Junior Web Developer
S
На сайте с 30.09.2016
Offline
469
#36
hakuna matata:
учитывая двух долб**бов sevlad и sitealert

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

hakuna matata:
это не тот форум для такого уровня.
Ну твой-то уровень известен. Сможешь понять этот кусок кода? :D
echo 'Tupaya Kozlina';
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
HM
На сайте с 14.01.2012
Offline
223
#37
danforth:
быстрый язык в одних задачах не всегда быстр в других.

А тебе не сложно сейчас взять re2 для твоего go кода и проверить еще раз? Я прост смотрю и не вижу особой разницы в скорости с pcre :)

danforth
На сайте с 18.12.2015
Offline
153
#38
hakuna matata:
А тебе не сложно сейчас взять re2 для твоего go кода и проверить еще раз?

Сложно, на самом деле re2 подключить не так просто, нужно скомпилить как либу, потом слинковать в бинарник. Потому что на Go никто не портировал re2. Как будет свободное время - поковыряюсь.

hakuna matata:
Я прост смотрю и не вижу особой разницы в скорости с pcre


Go без компиляции: 0.005807088 секунд
Go с компиляцией: 0.000459663 секунд (x12 speedup)
PHP: 0.000177860 секунд (x2.5 speedup, х32 speedup)

А так? Понятное дело, что большинство приложений делают что-то ещё, кроме выполнения регулярок. На самом деле есть ещё несколько мест, где PHP быстрее Go (там где задача плохо бьется на потоки и где вызов функции описан в сишном модуле). Например, всякие TLS реализации могут быть быстрее в пыхе, только их там особо и негде применить.

Sly32
На сайте с 29.03.2012
Offline
303
#39

не работает ошибка хотел привести асинхронный код

HM
На сайте с 14.01.2012
Offline
223
#40
danforth:
Потому что на Go никто не портировал re2. Как будет свободное время - поковыряюсь.

Не надо, я ошибся и думал что он там есть.

Вообще я удивлен насчет go, "думал намного лучше будет все" (c).

А посоветуйте заодно, на чем спамилку писать. Задача - просто слать 1 post запрос и парсить ответ. Сейчас шлю через php-curl, чето оно уже на 5к потоков сжирает проц и память ( у меня вообще на каждый запрос - 1 процесс php-cli, знаю что смешно). Я писал выше, что не программист, думал вот чего почитать, только не знаю что :) ноду или го?

Могу конечно накостылить что то на php с guzzle, но интересно послушать ваши советы.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий