updates submodule & fixes content benchmarks & sets up ci (#11851)
This commit is contained in:
48
.github/workflows/benchmarks.yml
vendored
Normal file
48
.github/workflows/benchmarks.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
name: Benchmarks
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 8 * * *'
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
concurrency: benchmarks
|
||||||
|
|
||||||
|
env:
|
||||||
|
ROBUST_BENCHMARKS_ENABLE_SQL: 1
|
||||||
|
ROBUST_BENCHMARKS_SQL_ADDRESS: ${{ secrets.BENCHMARKS_WRITE_ADDRESS }}
|
||||||
|
ROBUST_BENCHMARKS_SQL_PORT: ${{ secrets.BENCHMARKS_WRITE_PORT }}
|
||||||
|
ROBUST_BENCHMARKS_SQL_USER: ${{ secrets.BENCHMARKS_WRITE_USER }}
|
||||||
|
ROBUST_BENCHMARKS_SQL_PASSWORD: ${{ secrets.BENCHMARKS_WRITE_PASSWORD }}
|
||||||
|
ROBUST_BENCHMARKS_SQL_DATABASE: content_benchmarks
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
benchmark:
|
||||||
|
name: Run Benchmarks
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: 'recursive'
|
||||||
|
- name: Get Engine version
|
||||||
|
run: |
|
||||||
|
cd RobustToolbox
|
||||||
|
git fetch --depth=1
|
||||||
|
echo "::set-output name=out::$(git rev-parse HEAD)"
|
||||||
|
id: engine_version
|
||||||
|
- name: Run script on centcomm
|
||||||
|
uses: appleboy/ssh-action@master
|
||||||
|
with:
|
||||||
|
host: centcomm.spacestation14.io
|
||||||
|
username: robust-benchmark-runner
|
||||||
|
key: ${{ secrets.CENTCOMM_ROBUST_BENCHMARK_RUNNER_KEY }}
|
||||||
|
command_timeout: 100000m
|
||||||
|
script: |
|
||||||
|
mkdir benchmark_run_${{ github.sha }}
|
||||||
|
cd benchmark_run_${{ github.sha }}
|
||||||
|
wget https://raw.githubusercontent.com/space-wizards/RobustToolbox/${{ steps.engine_version.outputs.out }}/Tools/run_benchmarks.py
|
||||||
|
python3 run_benchmarks.py "${{ secrets.BENCHMARKS_WRITE_ADDRESS }}" "${{ secrets.BENCHMARKS_WRITE_PORT }}" "${{ secrets.BENCHMARKS_WRITE_USER }}" "${{ secrets.BENCHMARKS_WRITE_PASSWORD }}" "${{ github.sha }}"
|
||||||
|
rm run_benchmarks.py
|
||||||
|
cd ..
|
||||||
|
rmdir benchmark_run_${{ github.sha }}
|
||||||
@@ -5,6 +5,7 @@ using System.Runtime.Intrinsics.X86;
|
|||||||
using System;
|
using System;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using Robust.Shared.Analyzers;
|
||||||
using Robust.Shared.Maths;
|
using Robust.Shared.Maths;
|
||||||
using Robust.Shared.Random;
|
using Robust.Shared.Random;
|
||||||
using SysVector4 = System.Numerics.Vector4;
|
using SysVector4 = System.Numerics.Vector4;
|
||||||
@@ -12,7 +13,8 @@ using SysVector4 = System.Numerics.Vector4;
|
|||||||
namespace Content.Benchmarks
|
namespace Content.Benchmarks
|
||||||
{
|
{
|
||||||
[DisassemblyDiagnoser]
|
[DisassemblyDiagnoser]
|
||||||
public sealed class ColorInterpolateBenchmark
|
[Virtual]
|
||||||
|
public class ColorInterpolateBenchmark
|
||||||
{
|
{
|
||||||
#if NETCOREAPP
|
#if NETCOREAPP
|
||||||
private const MethodImplOptions AggressiveOpt = MethodImplOptions.AggressiveOptimization;
|
private const MethodImplOptions AggressiveOpt = MethodImplOptions.AggressiveOptimization;
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using Robust.Shared.Analyzers;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
namespace Content.Benchmarks
|
namespace Content.Benchmarks
|
||||||
{
|
{
|
||||||
[SimpleJob]
|
[SimpleJob]
|
||||||
public sealed class ComponentFetchBenchmark
|
[Virtual]
|
||||||
|
public class ComponentFetchBenchmark
|
||||||
{
|
{
|
||||||
[Params(5000)] public int NEnt { get; set; }
|
[Params(5000)] public int NEnt { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
<ProjectReference Include="..\Content.Shared\Content.Shared.csproj" />
|
<ProjectReference Include="..\Content.Shared\Content.Shared.csproj" />
|
||||||
<ProjectReference Include="..\Content.Tests\Content.Tests.csproj" />
|
<ProjectReference Include="..\Content.Tests\Content.Tests.csproj" />
|
||||||
<ProjectReference Include="..\Content.IntegrationTests\Content.IntegrationTests.csproj" />
|
<ProjectReference Include="..\Content.IntegrationTests\Content.IntegrationTests.csproj" />
|
||||||
|
<ProjectReference Include="..\RobustToolbox\Robust.Benchmarks\Robust.Benchmarks.csproj" />
|
||||||
<ProjectReference Include="..\RobustToolbox\Robust.Client\Robust.Client.csproj" />
|
<ProjectReference Include="..\RobustToolbox\Robust.Client\Robust.Client.csproj" />
|
||||||
<ProjectReference Include="..\RobustToolbox\Robust.Server\Robust.Server.csproj" />
|
<ProjectReference Include="..\RobustToolbox\Robust.Server\Robust.Server.csproj" />
|
||||||
<ProjectReference Include="..\RobustToolbox\Robust.Shared.Maths\Robust.Shared.Maths.csproj" />
|
<ProjectReference Include="..\RobustToolbox\Robust.Shared.Maths\Robust.Shared.Maths.csproj" />
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ namespace Content.Benchmarks
|
|||||||
{
|
{
|
||||||
// To actually run this benchmark you'll have to make DependencyCollection public so it's accessible.
|
// To actually run this benchmark you'll have to make DependencyCollection public so it's accessible.
|
||||||
|
|
||||||
public sealed class DependencyInjectBenchmark
|
[Virtual]
|
||||||
|
public class DependencyInjectBenchmark
|
||||||
{
|
{
|
||||||
[Params(InjectMode.Reflection, InjectMode.DynamicMethod)]
|
[Params(InjectMode.Reflection, InjectMode.DynamicMethod)]
|
||||||
public InjectMode Mode { get; set; }
|
public InjectMode Mode { get; set; }
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using Robust.Shared.Analyzers;
|
||||||
using Robust.Shared.Maths;
|
using Robust.Shared.Maths;
|
||||||
using Robust.Shared.Physics;
|
using Robust.Shared.Physics;
|
||||||
|
|
||||||
namespace Content.Benchmarks
|
namespace Content.Benchmarks
|
||||||
{
|
{
|
||||||
[SimpleJob, MemoryDiagnoser]
|
[SimpleJob, MemoryDiagnoser]
|
||||||
public sealed class DynamicTreeBenchmark
|
[Virtual]
|
||||||
|
public class DynamicTreeBenchmark
|
||||||
{
|
{
|
||||||
private static readonly Box2[] _aabbs1 =
|
private static readonly Box2[] _aabbs1 =
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using Robust.Shared.Analyzers;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
namespace Content.Benchmarks
|
namespace Content.Benchmarks
|
||||||
{
|
{
|
||||||
[SimpleJob]
|
[SimpleJob]
|
||||||
public sealed class EntityFetchBenchmark
|
[Virtual]
|
||||||
|
public class EntityFetchBenchmark
|
||||||
{
|
{
|
||||||
[Params(1000)] public int N { get; set; }
|
[Params(1000)] public int N { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using Moq;
|
using Moq;
|
||||||
|
using Robust.Shared.Analyzers;
|
||||||
using Robust.Shared.Exceptions;
|
using Robust.Shared.Exceptions;
|
||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
@@ -9,7 +10,8 @@ using Robust.Shared.Reflection;
|
|||||||
|
|
||||||
namespace Content.Benchmarks
|
namespace Content.Benchmarks
|
||||||
{
|
{
|
||||||
public sealed class EntityManagerGetAllComponents
|
[Virtual]
|
||||||
|
public class EntityManagerGetAllComponents
|
||||||
{
|
{
|
||||||
private IEntityManager _entityManager;
|
private IEntityManager _entityManager;
|
||||||
|
|
||||||
|
|||||||
42
Content.Benchmarks/MapLoadBenchmark.cs
Normal file
42
Content.Benchmarks/MapLoadBenchmark.cs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using Content.IntegrationTests;
|
||||||
|
using Content.Server.Maps;
|
||||||
|
using Robust.Server.Maps;
|
||||||
|
using Robust.Shared;
|
||||||
|
using Robust.Shared.Analyzers;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Map;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Benchmarks;
|
||||||
|
|
||||||
|
[Virtual]
|
||||||
|
public class MapLoadBenchmark
|
||||||
|
{
|
||||||
|
private PairTracker _pair = default!;
|
||||||
|
|
||||||
|
[GlobalSetup]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
ProgramShared.PathOffset = "../../../../";
|
||||||
|
_pair = PoolManager.GetServerClient().GetAwaiter().GetResult();
|
||||||
|
Paths = _pair.Pair.Server.ResolveDependency<IPrototypeManager>()
|
||||||
|
.EnumeratePrototypes<GameMapPrototype>().ToDictionary(x => x.ID, x => x.MapPath.ToString());
|
||||||
|
IoCManager.InitThread(_pair.Pair.Server.InstanceDependencyCollection);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<string> MapsSource { get; set; }
|
||||||
|
|
||||||
|
[ParamsSource(nameof(MapsSource))] public string Map;
|
||||||
|
|
||||||
|
public static Dictionary<string, string> Paths;
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public void LoadMap()
|
||||||
|
{
|
||||||
|
_pair.Pair.Server.ResolveDependency<IMapLoader>().LoadMap(new MapId(10), Paths[Map]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,11 +2,13 @@
|
|||||||
using System.Buffers.Binary;
|
using System.Buffers.Binary;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using Robust.Shared.Analyzers;
|
||||||
|
|
||||||
namespace Content.Benchmarks
|
namespace Content.Benchmarks
|
||||||
{
|
{
|
||||||
[SimpleJob]
|
[SimpleJob]
|
||||||
public sealed class NetSerializerIntBenchmark
|
[Virtual]
|
||||||
|
public class NetSerializerIntBenchmark
|
||||||
{
|
{
|
||||||
private MemoryStream _writeStream;
|
private MemoryStream _writeStream;
|
||||||
private MemoryStream _readStream;
|
private MemoryStream _readStream;
|
||||||
|
|||||||
@@ -7,13 +7,15 @@ using System.Text.Unicode;
|
|||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using Lidgren.Network;
|
using Lidgren.Network;
|
||||||
using NetSerializer;
|
using NetSerializer;
|
||||||
|
using Robust.Shared.Analyzers;
|
||||||
|
|
||||||
namespace Content.Benchmarks
|
namespace Content.Benchmarks
|
||||||
{
|
{
|
||||||
// Code for the *Slow and *Unsafe implementations taken from NetSerializer, licensed under the MIT license.
|
// Code for the *Slow and *Unsafe implementations taken from NetSerializer, licensed under the MIT license.
|
||||||
|
|
||||||
[MemoryDiagnoser]
|
[MemoryDiagnoser]
|
||||||
public sealed class NetSerializerStringBenchmark
|
[Virtual]
|
||||||
|
public class NetSerializerStringBenchmark
|
||||||
{
|
{
|
||||||
private const int StringByteBufferLength = 256;
|
private const int StringByteBufferLength = 256;
|
||||||
private const int StringCharBufferLength = 128;
|
private const int StringCharBufferLength = 128;
|
||||||
|
|||||||
@@ -1,12 +1,38 @@
|
|||||||
using BenchmarkDotNet.Running;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using BenchmarkDotNet.Configs;
|
||||||
|
using BenchmarkDotNet.Running;
|
||||||
|
using Content.IntegrationTests;
|
||||||
|
using Content.Server.Maps;
|
||||||
|
using Robust.Benchmarks.Configs;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Benchmarks
|
namespace Content.Benchmarks
|
||||||
{
|
{
|
||||||
internal static class Program
|
internal static class Program
|
||||||
{
|
{
|
||||||
|
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
|
MainAsync(args).GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task MainAsync(string[] args)
|
||||||
|
{
|
||||||
|
var pair = await PoolManager.GetServerClient();
|
||||||
|
var gameMaps = pair.Pair.Server.ResolveDependency<IPrototypeManager>().EnumeratePrototypes<GameMapPrototype>().ToList();
|
||||||
|
MapLoadBenchmark.MapsSource = gameMaps.Select(x => x.ID);
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine("\nWARNING: YOU ARE RUNNING A DEBUG BUILD, USE A RELEASE BUILD FOR AN ACCURATE BENCHMARK");
|
||||||
|
Console.WriteLine("THE DEBUG BUILD IS ONLY GOOD FOR FIXING A CRASHING BENCHMARK\n");
|
||||||
|
BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args, new DebugInProcessConfig());
|
||||||
|
#else
|
||||||
|
var config = Environment.GetEnvironmentVariable("ROBUST_BENCHMARKS_ENABLE_SQL") != null ? DefaultSQLConfig.Instance : null;
|
||||||
|
BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args, config);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
using System.Runtime.Intrinsics.X86;
|
using System.Runtime.Intrinsics.X86;
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using Robust.Shared.Analyzers;
|
||||||
|
|
||||||
namespace Content.Benchmarks
|
namespace Content.Benchmarks
|
||||||
{
|
{
|
||||||
public sealed class StereoToMonoBenchmark
|
[Virtual]
|
||||||
|
public class StereoToMonoBenchmark
|
||||||
{
|
{
|
||||||
[Params(128, 256, 512)]
|
[Params(128, 256, 512)]
|
||||||
public int N { get; set; }
|
public int N { get; set; }
|
||||||
|
|||||||
Submodule RobustToolbox updated: 42c6b9976a...74c86bf08c
Reference in New Issue
Block a user