Про улучшения

Как гласит народное предание, первыми словами обезьяны, когда она слезла с дерева, были — «раньше было лучше».

Созерцая глюки «Google Analytics», не могу с ней не согласиться.

Картинка дня

Подготовка нового релиза

BET

Узнал (из последней книжки одного модного писателя современного классика), что у моего метода тестирования, до которого я допер сам и применяю уже почти 10 лет, есть название — BET (bounded exhaustive testing).

Переводится как ограниченное задалбывающее исчерпывающее тестирование.

Про тестирование оперативной памяти

Вчера осуществил задуманное и накатал простенький тест памяти, который запускается прямо из под Windows.

В качестве подопытного кролика была планка на 16GB, с которой возникла заминка (см. мой комментарий за 2017-10-20).

Как положено, сначала была простейшая однопоточная реализация, которая гоняла в цикле код вида:

void MemTest_001(void* const pvBeg,void* const pvEnd)
{
 //последовательное заполнение одним и тем же значением

 typedef unsigned char value_type;
 
 const size_t nValues=(((const char*)pvEnd)-((const char*)pvBeg))/sizeof(value_type);

 value_type* const beg=reinterpret_cast<value_type*>(pvBeg);
 value_type* const end=beg+nValues;

 value_type v=0;

 for(;;++v)
 {
  std::fill(beg,end,v);

  for(const value_type* p=beg;p!=end;++p)
  {
   const value_type m=*p;
   
   if(m==v)
    continue;

   structure::str_formatter
    fmsg("bad value [%1]. expected value [%2]. position [%3].");
  
   fmsg<<m<<v<<size_t(p-beg);

   throw std::runtime_error(fmsg.str());
  }//for

  if(v==std::numeric_limits<value_type>::max())
   break;
 }//for v
}//MemTest_001

Запустил на 16GB и не дождался пока этот тест отработает до конца.

Распределил работу этого теста между десятью потоками (процессор 6950X). Отработало приблизительно минут за двенадцать — обвязка тестов убогая, поэтому время измерялось на глаз.

Если честно, я не ожидал, что все будет так медленно.

Потом я накатал несколько других тестов, которые последовательно заполняют память. Отрабатывают, но, чувствую — что-то все не то.
(далее…)

Trial IBProvider v3.47 [сборка 27110]

На сайт загружена новая сборка IBProvider (3.47.0.27110), в которую внесены два изменения.

1. Изничтожено использование std::locale. Один из пользователей заслал стек падения внутри этой конструкции. Судя по всему, проблема связана с параллельным вызовом setlocale.

Этот std::locale уже один раз был причиной проблем в прошлом. Вот опять напомнил о себе.

2. Переписано последнее «наследство» от второй версии IBProvider — «сравнитель» значений OLEDB типов. 10 лет собирался это сделать. Я рад, что это наконец-то произошло.

Релиз IBProvider v3.46

Привет всем.

Завершен процесс релиза 46-обновления третьей версии IBProvider — опубликованы новости.

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

Пока перестраивал код, в голову пришли следующие мысли:

1. Сначала программист на C++ больно и мучительно приходит к использованию счетчиков ссылок для управления временем жизни объектов размещаемых в куче.

2. Потом до него доходит, что счетчиков может быть несколько.

3. И наконец, реализации интерфейсов со счетчиками ссылок необязательно размещать в куче. Они могут быть статическими, а их add_ref/release ничего не делают.

К моменту, когда я дошел до третьего пункта в IBProvider v3 была написана куча кода, который попадал под эту оптимизацию. Вот как раз часть этого прошлого и была откорректирована в новом выпуске.

Нагрузочное тестирование SuperClassic FB3 на Windows 10

Следуя настоятельным рекомендациям (по поводу CORE-5632), занялся очень мутной работой — тестированием оперативной памяти. Каждой планки (8x16GB) по отдельности.

В качестве тестов — сначала (для проформы) MemTest86+ 5.01.

Потом, уже под Windows 10 Pro (1703), группа тестов провайдера, которая использовалась (успешно) для выявления битой памяти ноутбука. FB3 был сконфигурирован как SuperClassic — ну, чтобы памяти побольше ел.

Тесты запускались в 20 потоков. Каждый запуск начинался с чистой базы.
(далее…)

InterBase 2017 Update 1

На почту пришло уведомление об выпуске первого обновления InterBase 2017.

Я прям заинтересовался — неужели починили багу с savepoint, которая уже надоела и я решил сообщить им о ней.

Нет, не осилили.

Зато обнаружил в списке исправленных ошибок такую интересную запись:

INTB-3287 Transaction Inventory Page cleanup could cause database corruption in extreme case.

Если я все правильно догоняю, то это CORE-5415 🙂

Вести с полей

Привет всем.

На сайт загружен новый триал IBProvider, сборку которого (3.45.0.26658) планируется довести до релиза.

В новой сборке откорректирована поддержка UTF8. Ранее, UTF8 символ отображался на два UTF16 (WCHAR) символа. Это обеспечивало поддержку всех допустимых символов UTF8, но создавало определенные трудности с определение максимального количества символов в колонке/параметре. Эти трудности начали приносить невыносимые страдания одному из наших последних клиентов, поэтому я решил вернуть отношение один UTF16 символ на один UTF8 символ и добавить свойство инициализации wchars_in_utf8_symbol, которое позволяет вернуться к двум UTF16 символам на один UTF8 символ.

Все остальные изменения в провайдере связанны с реорганизацией и ревизией кода.

Первое. Я изничтожил свои велосипеды (изобретенные в 2000-ом году) вокруг std::vector. И начал использовать этот класс как есть. Бинарники немного увеличились в размерах (максимум на 0.5%), производительность вроде не просела.

Второе. Некоторые внутренние объекты преобразованы из динамических в статические. Для такой махины как IBProvider, такая оптимизация мало на что повлияет. Но тем не менее.

И третье. Я тут начал читать (догреб до середины) «Эффективный и современный C++» Скотта Мейерса. Пришел к выводу, что в настоящий момент просто глупо беспокоиться за совместимость со старыми компиляторами (которые по факту я уже и не использую) и пора уже двигаться вперед. Move-трюки я уже давно начал использовать, хотя и прятал эти конструкции от старых компиляторов. Теперь начал использовать новые штуки (типа emplace_back) из STL. Без всяких условностей. Я рад что это произошло.

IBProvider v3.44

Привет всем.

В экстренном порядке пришлось выпустить версию IBProvider v3.44.

Вчера, разгребая результаты выполнения тестов для InterBase 2017, обнаружил ошибку с NULL-значениями в IN-параметрах с типом BLOB.

Я даже посмотрел в истории — когда конкретно эта бага была внесена в код.

11 ноября 2016 года 14:54:35.

Судя по бортовому журналу, в этот день к этому моменту у меня уже был «отходняк» — был выпущен провайдер с собственным клиентом к FB3 и осилена покупка Windows 10 на новую рабочую лошадку.

« Предыдущие записи