<?php

set_time_limit(0);

include "../vendor/autoload.php";

use Knik\Binn\BinnList;

$write = new BinnList();

$write->addStr("You may have noticed that not all the lines of this program perform actions when the code is executed. There is a line containing a comment (beginning with //). There is a line with a directive for the preprocessor (beginning with #). There is a line that defines a function (in this case, the main function). And, finally, a line with a statements ending with a semicolon (the insertion into cout), which was within the block delimited by the braces ( { } ) of the main function. 
The program has been structured in different lines and properly indented, in order to make it easier to understand for the humans reading it. But C++ does not have strict rules on indentation or on how to split instructions in different lines. For example, instead of");

$write->addStr("If the first bit of size is 0, it uses only 1 byte. So when the data size is up to 127 (0x7F) bytes the size parameter will use only 1 byte. Otherwise a 4 byte size parameter is used, with the msb 1. Leaving us with a high limit of 2 GigaBytes (0x7FFFFFFF).");
$write->addInt16(454533);
$write->addInt16(12943);

$write->addStr("Game AdminPanel — web-панель для управления игровыми серверами. Позволяет управлять серверами таких игр как Half-Life, Counter-Strike, Team Fortress и других. Написана с использование PHP фреймворка CodeIgniter 2.1.3, благодаря этому панель очень гибка в настройке, расширении модулями. АдминПанель поддерживает несколько операционных систем, работает с самыми популярными базами данных (MySQL, PostgreSQL и др.), поддерживает все игры Valve.

Разработчик: ET-NiK
Тестеры: kissbb, GordonFreeman, Pontiy

Возможности

Управление любыми игровыми серверами и программами;
Поддержка операционных систем Linux и Windows;
Поддержка MySQL, PDO, PostgreSQL, Oracle, Microsoft SQL Server;
Мультиязычность;
Смена карт на сервере, остановка, перезагрузка серверов;
Просмотр логов серверов;
Управление игроками (бан, кик, смена ника);
Отправка rcon команд на сервер;
Просмотр консоли сервера;
Задания для серверов (остановка, обновление в заданное время);
Редактирование конфигурационных файлов (server.cfg, mapcycle.txt и др.);
Загрузка игровых файлов (карт, плагинов);
Создание пользователей с разными правами на определенные серверы;
Поддержка модулей;
Регистрация пользователей (при необходимости выключается);
Автоматическая установка серверов через SteamCMD;
Автоматическая установка серверов из архивов;
Работа на всех веб-серверах (Apache, Nginx, IIS и др.).");

$write->addStr("If you have seen C++ code before, you may have seen cout being used instead of std::cout. Both name the same object: the first one uses its unqualified name (cout), while the second qualifies it directly within the namespace std (as std::cout).

cout is part of the standard library, and all the elements in the standard C++ library are declared within what is a called a namespace: the namespace std.");

$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");
$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");
$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");
$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");
$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");
$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");
$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");
$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");
$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");
$write->addStr("Both ways of accessing the elements of the std namespace (explicit qualification and using declarations) are valid in C++ and produce the exact same behavior. For simplicity, and to improve readability, the examples in these tutorials will more often use this latter approach with using declarations, although note that explicit qualification is the only way to guarantee that name collisions never happen.");

$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");
$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");
$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");
$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");
$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");
$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");
$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");
$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");
$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");
$write->addStr("Наконец то, дождались! На свет вышла новая, долгожданная версия Sven Coop 5.0.Разработка этой версии очень сильно затянулась. Более года назад мы писали, что вот вот выйдет Sven Coop 5.0, но всё оказалось не так быстро.Из самых важных нововведений можно отметить сохранение между уровнями, а также новые, тактические карты.");

$write->addInt16(4091243883);
$write->addInt16(4091243883);
$write->addUint8(233);

// file_put_contents("large_data.bin", $write->get_binn_val());
// echo "Writed {$write->binn_size()} bytes\n";

// Binn

$bin_string = file_get_contents("large_data.bin");
$read = new BinnList();

$time_start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $read->binnFree();
    $read->binnOpen($bin_string);
    $read->getBinnArr();
}
echo "Time (Binn): " . (microtime(true) - $time_start) . "\n";

// print_r($read->get_binn_arr());
// file_put_contents("large_data.json", json_encode($read->get_binn_arr()));

// JSON

$json_string = file_get_contents("large_data.json");

$time_start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $rjson = json_decode($json_string);
}
echo "Time (Json): " . (microtime(true) - $time_start) . "\n";

/* My results:
 *
 * PHP 5.6.19-0+deb8u1
 * Debian 3.16.7-ckt25-2
 * Intel(R) Celeron(R) CPU B820 @ 1.70GHz 8Gb RAM
 *
 * Time (Binn): 311.60880017281
 * Time (Json): 338.87904906273
 *
 */
