воскресенье, 20 декабря 2020 г.

Сравнение флотов (чисел с плавающей точкой) в NUnit

0.9999999999
vs
1.0000000001
У чисел с плавающей запятой (float, double) есть такая особенность, что из-за проблем потери точности, они могут получаться не равными, даже если должны быть такими с точки зрения математики. И это зависит не только от используемых операций, но и от архитектуры железа, а также флагов процессора, установленных в момент вычислений.
Например, 72/6 может быть не равно 3*4.
Но сравнивать их все равно нужно. Поэтому используется сравнение с определенной точностью. Берется модуль (абсолютное значение) разности этих чисел и сравнивается с небольшой константой. Если модуль разницы больше этой константы, числа считаются разными.
В библиотеке NUnit для таких сравнений есть специальные конструкции
Вместо велосипедов
Assert.IsTrue(Mathf.Abs(actualValue - expectedValue) < tolerance);
и
Assert.Less(Mathf.Abs(actualValue - expectedValue), tolerance);
В NUnit есть
Assert.AreEqual(expectedValue, actualValue, tolerance); 

пятница, 18 декабря 2020 г.

Доступная память в Linux



Объем памяти, доступной на виртуальной машине зависит от выбранного дистрибутива Linux. Точнее, от настроек ядра и драйверов, которые включены по умолчанию.

Я попробовал установить на одну и ту же машину c 2Гб памяти Debian 10, CentOS 8 и Ubuntu 20.

Такой получился объем доступной памяти по умолчанию:

# cat /proc/meminfo | grep MemTotal

Debian
MemTotal:        1993756 kB

CentOS:
MemTotal:        1811096 kB

Ubuntu:
MemTotal:        1986080 kB

На CentOS ситуацию можно улучшить, отключив kdump, который изначально включен и съедает 160 Мб.

Редактируем конфиг grub:
# vi /etc/default/grub

Меняем crashkernel=auto на crashkernel=no в GRUB_CMDLINE_LINUX

Применяем изменения:
# grub2-mkconfig -o /boot/grub2/grub.cfg

Отключаем kdump:
# systemctl disable kdump

Перезагружаемся:
# shutdown -r now

Уже лучше, но все еще хуже, чем в Debian и Ubuntu:
MemTotal:        1974584 kB

Таким образом, из трех данных версий Linux, больше всего памяти, доступной приложениям, оставляет Debian, меньше всего - CentOS.


понедельник, 1 июня 2020 г.

Совмещение логирования и сбора метрик

Как сосчитать количество ошибок и предупреждений в сервисе?
В обертку над логгером встраиваем счетчики, собирающие телеметрию.

class Telemetry
{
	public int Warnings;
	public int Errors;
}

static class Log
{
	public static Telemetry Telemetry = new Telemetry();

	public static void Warning(string msg)
	{
		Telemetry.Warnings++;
		Console.WriteLine($"[Warning] {msg}");
} public static void Error(string msg) { Telemetry.Errors++; Console.WriteLine($"[Error] {msg}"); } }