Локстеп с инпутами и детерминизмом подходит только для игр с низким тикрейтом (10Гц или меньше), так как требует гарантии доставки инпута (rudp), обычно используется в стратегиях и моба. Снапшоты и инпуты используют в динамичных играх/шутерах, где негарантированную доставку снапшота можно игнорировать (может быть интерполирован с прошлым) и важна больше скорость доставки. Для уменьшения размера снапшота используют делта компрессию и компрессию таблицы изменений
В тестах С# string, в java и других byte[], не справедливо
C# unsafe
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
public class Program
{
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public static unsafe Int32 LevDist(char[] s1, char[] s2)
{
var m = s1.Length;
var n = s2.Length;
// Edge cases.
if (m == 0)
return n;
if (n == 0)
return m;
var n1 = n + 1;
var v0Ptr = Marshal.AllocHGlobal(n1 * sizeof(int));
var v1Ptr = Marshal.AllocHGlobal(n1 * sizeof(int));
var v0 = (int*) v0Ptr;
var v1 = (int*) v1Ptr;
for (var i = 0; i < n1; i++)
{
v0[i] = i;
v1[i] = i;
}
for (var i = 0; i < m; ++i)
{
v1[0] = i + 1;
for (var j = 0; j < n; ++j)
{
var substCost = (s1[i] == s2[j]) ? v0[j] : (v0[j] + 1);
var delCost = v0[j + 1] + 1;
var insCost = v1[j] + 1;
v1[j + 1] = Math.Min(Math.Min(substCost, delCost), insCost);
}
var temp = v0;
v0 = v1;
v1 = temp;
}
var result = v0[n];
Marshal.FreeHGlobal(v0Ptr);
Marshal.FreeHGlobal(v1Ptr);
return result;
}
public static void Main()
{
var s1 = new char[15000];
for (var i = 0; i < s1.Length; i++)
s1[i] = 'a';
var s2 = s1;
var s3 = new char[15000];
for (var i = 0; i < s3.Length; i++)
s3[i] = 'b';
for (var i = 0; i < 5; ++i)
{
var execTimer = new Stopwatch();
execTimer.Start();
Console.WriteLine(LevDist(s1, s2));
Console.WriteLine(LevDist(s1, s3));
execTimer.Stop();
Console.WriteLine($"Finished 2 in {(execTimer.ElapsedMilliseconds / 1000.0):0.000}s");
}
}
}
Можно просто скопировать из контейнера нужные либы (/usr/include, /usr/lib и тд) в хост машину и прокинуть прокси io на исполняемые файлы через docker exec как например сделал в github.com/eduardmatveev/subsys-proxy
go: 0.491s
.net: 0.699s