Commit dc1829f7 authored by Ondřej Pavlica's avatar Ondřej Pavlica
Browse files

Performance benchmarks

parent 89a80632
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -53,11 +53,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AverageVolumeJump", "src\Gr
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Preprocessors", "Preprocessors", "{93698D5B-8316-45AD-8B9F-2A65721C4706}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DialToneCutter", "src\Preprocessors\DialToneCutter\DialToneCutter.csproj", "{C2BD219D-9BDA-4D13-8A3B-EFEF8C520680}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RingingToneCutter", "src\Preprocessors\DialToneCutter\RingingToneCutter.csproj", "{C2BD219D-9BDA-4D13-8A3B-EFEF8C520680}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Forms", "fiddles\Test.Forms\Test.Forms.csproj", "{1FA18C7F-C5FE-4B0A-81A4-597FDCB64177}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConfigurationProviders", "src\Utilities\ConfigurationProviders\ConfigurationProviders.csproj", "{769DB2DC-FA34-48E9-8A73-9460D11FD0CE}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfigurationProviders", "src\Utilities\ConfigurationProviders\ConfigurationProviders.csproj", "{769DB2DC-FA34-48E9-8A73-9460D11FD0CE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmarks", "fiddles\Benchmarks\Benchmarks.csproj", "{A828E8D0-3027-4A01-9EE0-6D182E884F9A}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -141,6 +143,10 @@ Global
		{769DB2DC-FA34-48E9-8A73-9460D11FD0CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{769DB2DC-FA34-48E9-8A73-9460D11FD0CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{769DB2DC-FA34-48E9-8A73-9460D11FD0CE}.Release|Any CPU.Build.0 = Release|Any CPU
		{A828E8D0-3027-4A01-9EE0-6D182E884F9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{A828E8D0-3027-4A01-9EE0-6D182E884F9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{A828E8D0-3027-4A01-9EE0-6D182E884F9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{A828E8D0-3027-4A01-9EE0-6D182E884F9A}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
+30 −0
Original line number Diff line number Diff line
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="BenchmarkDotNet" Version="0.12.1" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.5" />
    <PackageReference Include="Moq" Version="4.14.1" />
    <PackageReference Include="Serilog" Version="2.9.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\src\Api\Api.csproj" />
    <ProjectReference Include="..\..\src\Common\Common.csproj" />
    <ProjectReference Include="..\..\src\Decoders\FFmpegDecoder\FFmpegDecoder.csproj" />
    <ProjectReference Include="..\..\src\Decoders\WavDecoder\WavDecoder.csproj" />
    <ProjectReference Include="..\..\src\Graders\Clipping\ClippingHistogram\ClippingHistogram.csproj" />
    <ProjectReference Include="..\..\src\Graders\Cutoff\VoiceCutoffByRms\VoiceCutoffByRms.csproj" />
    <ProjectReference Include="..\..\src\Graders\Noise\AverageSNRFromVAD\AverageSNRFromVAD.csproj" />
    <ProjectReference Include="..\..\src\Graders\Silence\SilenceRunsFromVAD\SilenceRunsFromVAD.csproj" />
    <ProjectReference Include="..\..\src\Graders\Volume\AverageVolumeJump\AverageVolumeJump.csproj" />
    <ProjectReference Include="..\..\src\Graders\Volume\VolumeHistogram\VolumeHistogram.csproj" />
    <ProjectReference Include="..\..\src\Preprocessors\DialToneCutter\RingingToneCutter.csproj" />
    <ProjectReference Include="..\..\src\Utilities\VoiceActivityDetector\VoiceActivityDetector.csproj" />
  </ItemGroup>

</Project>
+53 −0
Original line number Diff line number Diff line
using AudioGrader.Decoders.FFmpegDecoder;
using AudioGrader.Decoders.WavDecoder;
using BenchmarkDotNet.Attributes;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;

namespace Benchmarks
{
    public class Decoders
    {
        readonly MemoryStream wavStream = new MemoryStream();
        readonly MemoryStream oggStream = new MemoryStream();

        public Decoders()
        {
            FFMpegCore.FFMPEG.FFMpegOptions.Options.RootDirectory = Globals.FFmpegExecutableDirectory;

            using Stream wav = File.OpenRead(Globals.WavFilePath);
            wav.CopyTo(wavStream);
            using Stream ogg = File.OpenRead(Globals.OggFilePath);
            ogg.CopyTo(oggStream);
        }

        [IterationSetup]
        public void Setup()
        {
            wavStream.Position = 0;
            oggStream.Position = 0;
        }

        [Benchmark]
        public async Task WavDecoder()
        {
            await new WavDecoder().ToChannelSignals(wavStream);
        }

        [Benchmark]
        public async Task FFmpegDecoder_Wav()
        {
            await new FFmpegDecoder().ToChannelSignals(wavStream);
        }

        [Benchmark]
        public async Task FFmpegDecoder_Ogg()
        {
            await new FFmpegDecoder().ToChannelSignals(wavStream);
        }

    }
}
+15 −0
Original line number Diff line number Diff line
using AudioGrader.Common.Interfaces;
using System;
using System.Collections.Generic;
using System.Text;

namespace Benchmarks
{
    class DummyConfigurationProvider : IModuleConfigurationProvider
    {
        public TConfigModel GetConfiguration<TConfigModel>() where TConfigModel : notnull, IModuleConfiguration<TConfigModel>, new()
        {
            return new TConfigModel();
        }
    }
}
+66 −0
Original line number Diff line number Diff line
using AudioGrader.Common.Interfaces;
using AudioGrader.Decoders.FFmpegDecoder;
using AudioGrader.Decoders.WavDecoder;
using AudioGrader.Graders.Clipping.ClippingHistogram;
using AudioGrader.Graders.Cutoff.VoiceCutoffByRms;
using AudioGrader.Graders.Noise.AverageSNRFromVAD;
using AudioGrader.Graders.Silence.SilenceRunsFromVAD;
using AudioGrader.Graders.Volume.AverageVolumeJump;
using AudioGrader.Graders.Volume.VolumeHistogram;
using AudioGrader.Preprocessors.RingingToneCutter;
using Microsoft.Extensions.DependencyInjection;
using Moq;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;

namespace Benchmarks
{
    class DummyModuleLoader : AudioGrader.Api.Modules.IModuleLoader
    {
        IServiceProvider serviceProvider = new DefaultServiceProviderFactory().CreateBuilder(new ServiceCollection())
                .AddSingleton(Mock.Of<Serilog.ILogger>())
                .AddSingleton<IModuleConfigurationProvider>(new DummyConfigurationProvider()).BuildServiceProvider();

        static readonly Dictionary<string, Type> types = new[]
        {
            typeof(WavDecoder),
            typeof(FFmpegDecoder),
            typeof(ClippingHistogram),
            typeof(VoiceCutoffByRms),
            typeof(AverageSNRFromVAD),
            typeof(SilenceRunsFromVAD),
            typeof(AverageVolumeJump),
            typeof(VolumeHistogram),
            typeof(RingingToneCutter)
        }.ToDictionary(x => x.Name, x => x);
        
        public string GetModuleAssemblyFilePath(string moduleName)
        {
            throw new NotImplementedException();
        }

        public IEnumerable<string> ListModules()
        {
            throw new NotImplementedException();
        }

        public IEnumerable<string> ListModules<T>()
        {
            throw new NotImplementedException();
        }

        public object LoadModule(string typeName)
        {
            return ActivatorUtilities.CreateInstance(serviceProvider, types[typeName]);
        }

        [return: MaybeNull]
        public T LoadModule<T>(string typeName)
        {
            return (T)LoadModule(typeName);
        }
    }
}
Loading