Search
Write a publication
Pull to refresh
0
0
Send message
Локстеп с инпутами и детерминизмом подходит только для игр с низким тикрейтом (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");
        }
    }
}


go: 0.491s
.net: 0.699s
Можно просто скопировать из контейнера нужные либы (/usr/include, /usr/lib и тд) в хост машину и прокинуть прокси io на исполняемые файлы через docker exec как например сделал в github.com/eduardmatveev/subsys-proxy

Information

Rating
Does not participate
Registered
Activity