суббота, 29 ноября 2014 г.

Throttling


Троттлинг (throttling) - это регулирование (ограничение) скорости какого-нибудь процесса. Например, bandwidth throttling - регулирование пропускной способности канала (обычно измеряется в килобайтах в секунду, kB/s).

В листинге ниже показано, как можно реализовать троттлинг.

  1. for (int i = 0; i < 1000; i++)
  2. {
  3.     while (!throttle_acquire()); //цикл ожидания
  4.     doWork(); //выпоняем работу
  5. }

В этом примере процесс состоит из 1000 итераций. Каждая итерация заключается в вызове функции doWork(), которая, например, отправляет очередную порцию данных. Ограничение скорости заключается в введении лимита на количество этих вызовов N за период времени dT. Перед вызовом doWork() осуществляется проверка превышения лимита: функция throttle_acquire() возвращает false, если лимит превышен, и true, в противном случае.

Троттлинг можно реализовать с использованием кольцевого буфера. Этот кольцевой буфер заполняется моментами времени последних вызовов функции doWork() (см пример выше). Размер буфера равен максимально разрешенному количеству этих вызовов N за период времени dT. Если буфер полностью заполнен, то функция acquire() возвращает false. Это означает, что необходимо подождать, пока из буфера не будет удален хотя бы один момент времени, который располагается от текущего момента ("сейчас") дальше, чем dT.

Реализацию троттлинга на C++ (throttle.h)  я выложил на github: https://github.com/coolsoftware/Throttle.

Пример использования класса throttle можно посмотреть в TestThrottle.cpp.

===
Перепечатка материалов блога разрешается с обязательной ссылкой на blog.coolsoftware.ru

четверг, 27 ноября 2014 г.

Сборка zlib в Visual Studio 2010


1. Скачиваем zlib 1.2.8 с http://www.zlib.net/
2. Распаковываем архив в c:\zlib-1.2.8
3. Открываем в Visual Studio 2010 проект C:\zlib-1.2.8\contrib\vstudio\vc10\zlibvc.sln
4. Меняем следующие настройки проекта zlibstat:

  Конфигурация Debug:

    General->Output Directory: ..\..\..\win32-MDd\
    General->Intermediate Directory: ..\..\..\win32-MDd\Tmp\
    C/C++->Preprocessor->Preprocessor Definitions: <удаляем ZLIB_WINAPI>
    C/C++->Code Generation->Runtime Library: Multi-threaded Debug DLL (/MDd)
    Librarian->General->Output File: $(OutDir)\..\zlibMDd.lib

  Конфигурация Release:

    General->Output Directory: ..\..\..\win32-MT\
    General->Intermediate Directory: ..\..\..\win32-MT\Tmp\
    C/C++->Preprocessor->Preprocessor Definitions: <удаляем ZLIB_WINAPI>
    C/C++->Code Generation->Runtime Library: Multi-threaded (/MT)
    Librarian->General->Output File: $(OutDir)\..\zlibMT.lib
   
5. Собираем Debug и Release версии zlibstat. На выходе получаем:

  C:\zlib-1.2.8\zlibMDd.lib
  C:\zlib-1.2.8\zlibMT.lib

6. Открываем в Visual Studio 2010 любой проект C++ и открываем Property Manager->(Project Name)->Debug | Win32->Microsoft.Cpp.Win32.user->Common Properties->VC++ Directories. Добавляем c:\zlib-1.2.8 в Include Directories, Library Direcories и Source Directories.


===
Перепечатка материалов блога разрешается с обязательной ссылкой на blog.coolsoftware.ru