├── ab.exe ├── lib ├── Npgsql.dll ├── sqlite3.dll ├── MySql.Data.dll ├── ServiceStack.dll ├── DotNetOpenAuth.dll ├── Mono.Security.dll ├── Mono.Data.Sqlite.dll ├── ServiceStack.Text.dll ├── System.Web.Razor.dll ├── ServiceStack.Client.dll ├── ServiceStack.Common.dll ├── ServiceStack.OrmLite.dll ├── ServiceStack.Razor.dll ├── ServiceStack.Redis.dll ├── ServiceStack.Server.dll ├── ServiceStack.Api.Swagger.dll ├── ServiceStack.Interfaces.dll ├── ServiceStack.OrmLite.MySql.dll ├── ServiceStack.OrmLite.Sqlite.dll ├── ServiceStack.Logging.Log4Net.dll ├── ServiceStack.OrmLite.SqlServer.dll ├── ServiceStack.OrmLite.PostgreSQL.dll ├── ServiceStack.Authentication.OAuth2.dll ├── ServiceStack.Authentication.OpenId.dll ├── ServiceStack.Authentication.OAuth2.xml ├── ServiceStack.Authentication.OpenId.xml ├── copy.bat └── ServiceStack.Razor.xml ├── src ├── BenchmarksAnalyzer │ ├── Global.asax │ ├── Content │ │ ├── img │ │ │ ├── logo.png │ │ │ ├── login.png │ │ │ ├── splash.png │ │ │ ├── AdminUI.png │ │ │ ├── http-icon.png │ │ │ ├── charts-bare.png │ │ │ ├── github-10-l.png │ │ │ ├── login-modal.png │ │ │ ├── run-command.png │ │ │ ├── apache318x260.png │ │ │ ├── create-testrun.png │ │ │ ├── custom-labels.png │ │ │ ├── github-10-xxl.png │ │ │ ├── glimpse-panel.png │ │ │ ├── no-profile-pic.jpg │ │ │ ├── search-filter.png │ │ │ ├── summary-bare.png │ │ │ ├── upload-files.png │ │ │ ├── upload-results.png │ │ │ ├── charts-labelled.png │ │ │ ├── create-testplan.png │ │ │ ├── oauth-providers.png │ │ │ ├── publish-aws-menu.png │ │ │ ├── summary-labelled.png │ │ │ ├── updated-testrun.png │ │ │ ├── edit-custom-labels.png │ │ │ ├── iis-redirect-https.png │ │ │ ├── no-profile-pic-200.png │ │ │ ├── no-profile-pic-64.png │ │ │ ├── no-profile-pic-96.png │ │ │ ├── publish-aws-deploy.png │ │ │ ├── saved-custom-labels.png │ │ │ ├── benchmark-example-dbs.png │ │ │ ├── export-search-filter.png │ │ │ ├── publish-aws-template.png │ │ │ ├── iis-redirect-https-panel.png │ │ │ └── upload-as-new-testruns.png │ │ └── default.css │ ├── Scripts │ │ ├── loading.gif │ │ ├── processing.gif │ │ └── fineuploader-3.2.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ ├── fontawesome-webfont.woff2 │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── HtmlExtensions.cs │ ├── GlimpseSecurityPolicy.cs │ ├── Properties │ │ ├── PublishProfiles │ │ │ └── WebDeploy.pubxml │ │ └── AssemblyInfo.cs │ ├── Web.Debug.config │ ├── Web.Release.config │ ├── Views │ │ ├── SearchTestResults.cshtml │ │ ├── Shared │ │ │ └── AutoGrid.cshtml │ │ └── ViewTestPlan.cshtml │ └── Global.asax.cs ├── BenchmarksAnalyzer.ServiceModel │ ├── MyInfo.cs │ ├── Ping.cs │ ├── Types │ │ ├── UserInfo.cs │ │ ├── TestRun.cs │ │ ├── TestPlan.cs │ │ ├── DisplayResult.cs │ │ └── TestResult.cs │ ├── TestRuns.cs │ ├── ViewTestPlan.cs │ ├── EditTestPlan.cs │ ├── TestPlans.cs │ ├── SearchTestResults.cs │ ├── UploadTestResults.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ └── BenchmarksAnalyzer.ServiceModel.csproj └── BenchmarksAnalyzer.ServiceInterface │ ├── ModelExtensions.cs │ ├── UserSession.cs │ ├── AdminServices.cs │ ├── TestServices.cs │ ├── Properties │ └── AssemblyInfo.cs │ ├── WebServices.cs │ ├── BenchmarksAnalyzer.ServiceInterface.csproj │ └── ApacheBenchmarkUtils.cs ├── servers ├── Techempower.AspNet │ ├── Global.asax │ ├── Views │ │ └── Fortunes.cshtml │ ├── Global.asax.cs │ ├── Web.Debug.config │ ├── Web.Release.config │ ├── Properties │ │ └── AssemblyInfo.cs │ └── Web.config ├── Techempower.SelfHost │ ├── Views │ │ └── Fortunes.cshtml │ ├── App.config │ ├── Program.cs │ ├── Web.Debug.config │ ├── Web.Release.config │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Web.config │ └── Techempower.SelfHost.csproj ├── Techempower.HttpListener │ ├── Views │ │ └── Fortunes.cshtml │ ├── Program.cs │ ├── App.config │ ├── Web.Debug.config │ ├── Web.Release.config │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Web.config │ └── Techempower.HttpListener.csproj ├── Techempower.HttpListener.Pool │ ├── Views │ │ └── Fortunes.cshtml │ ├── App.config │ ├── Web.Debug.config │ ├── Web.Release.config │ ├── Program.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Web.config │ └── Techempower.HttpListener.Pool.csproj ├── Techempower.HttpListener.SmartPool │ ├── Views │ │ └── Fortunes.cshtml │ ├── App.config │ ├── Web.Debug.config │ ├── Web.Release.config │ ├── Program.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Web.config │ └── Techempower.HttpListener.SmartPool.csproj ├── Perf.ServiceInterface │ ├── PerfServices.cs │ ├── PerfAsyncServices.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ └── Perf.ServiceInterface.csproj └── Techempower.ServiceInterface │ ├── Properties │ └── AssemblyInfo.cs │ ├── ConfigApp.cs │ ├── Techempower.ServiceInterface.csproj │ └── TechmeServices.cs ├── run-aspnet-db-benchmarks.bat ├── run-aspnet-benchmarks.bat ├── tests └── Perf.Tests │ ├── Properties │ └── AssemblyInfo.cs │ ├── PerfTests.cs │ └── Perf.Tests.csproj ├── run-selfhost-benchmarks.bat ├── run-httplistener-benchmarks.bat ├── run-httplistenerpool-benchmarks.bat ├── run-smartpool-benchmarks.bat ├── run-all-raw-benchmarks.bat ├── run-all-db-benchmarks.bat ├── .gitignore └── run-all-benchmarks.bat /ab.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/ab.exe -------------------------------------------------------------------------------- /lib/Npgsql.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/Npgsql.dll -------------------------------------------------------------------------------- /lib/sqlite3.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/sqlite3.dll -------------------------------------------------------------------------------- /lib/MySql.Data.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/MySql.Data.dll -------------------------------------------------------------------------------- /lib/ServiceStack.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.dll -------------------------------------------------------------------------------- /lib/DotNetOpenAuth.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/DotNetOpenAuth.dll -------------------------------------------------------------------------------- /lib/Mono.Security.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/Mono.Security.dll -------------------------------------------------------------------------------- /lib/Mono.Data.Sqlite.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/Mono.Data.Sqlite.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Text.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Text.dll -------------------------------------------------------------------------------- /lib/System.Web.Razor.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/System.Web.Razor.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Client.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Client.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Common.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Common.dll -------------------------------------------------------------------------------- /lib/ServiceStack.OrmLite.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.OrmLite.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Razor.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Razor.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Redis.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Redis.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Server.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Server.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Api.Swagger.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Api.Swagger.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Interfaces.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Interfaces.dll -------------------------------------------------------------------------------- /lib/ServiceStack.OrmLite.MySql.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.OrmLite.MySql.dll -------------------------------------------------------------------------------- /lib/ServiceStack.OrmLite.Sqlite.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.OrmLite.Sqlite.dll -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Global.asax: -------------------------------------------------------------------------------- 1 | <%@ Application Codebehind="Global.asax.cs" Inherits="BenchmarksAnalyzer.Global" Language="C#" %> 2 | -------------------------------------------------------------------------------- /lib/ServiceStack.Logging.Log4Net.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Logging.Log4Net.dll -------------------------------------------------------------------------------- /lib/ServiceStack.OrmLite.SqlServer.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.OrmLite.SqlServer.dll -------------------------------------------------------------------------------- /servers/Techempower.AspNet/Global.asax: -------------------------------------------------------------------------------- 1 | <%@ Application Codebehind="Global.asax.cs" Inherits="Techempower.AspNet.Global" Language="C#" %> 2 | -------------------------------------------------------------------------------- /lib/ServiceStack.OrmLite.PostgreSQL.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.OrmLite.PostgreSQL.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Authentication.OAuth2.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Authentication.OAuth2.dll -------------------------------------------------------------------------------- /lib/ServiceStack.Authentication.OpenId.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/lib/ServiceStack.Authentication.OpenId.dll -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/logo.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Scripts/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Scripts/loading.gif -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/login.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/splash.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Scripts/processing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Scripts/processing.gif -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/AdminUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/AdminUI.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/http-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/http-icon.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/charts-bare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/charts-bare.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/github-10-l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/github-10-l.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/login-modal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/login-modal.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/run-command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/run-command.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/apache318x260.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/apache318x260.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/create-testrun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/create-testrun.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/custom-labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/custom-labels.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/github-10-xxl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/github-10-xxl.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/glimpse-panel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/glimpse-panel.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/no-profile-pic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/no-profile-pic.jpg -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/search-filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/search-filter.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/summary-bare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/summary-bare.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/upload-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/upload-files.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/upload-results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/upload-results.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/charts-labelled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/charts-labelled.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/create-testplan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/create-testplan.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/oauth-providers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/oauth-providers.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/publish-aws-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/publish-aws-menu.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/summary-labelled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/summary-labelled.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/updated-testrun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/updated-testrun.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/edit-custom-labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/edit-custom-labels.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/iis-redirect-https.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/iis-redirect-https.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/no-profile-pic-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/no-profile-pic-200.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/no-profile-pic-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/no-profile-pic-64.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/no-profile-pic-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/no-profile-pic-96.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/publish-aws-deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/publish-aws-deploy.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/saved-custom-labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/saved-custom-labels.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/benchmark-example-dbs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/benchmark-example-dbs.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/export-search-filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/export-search-filter.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/publish-aws-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/publish-aws-template.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/iis-redirect-https-panel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/iis-redirect-https-panel.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/img/upload-as-new-testruns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/Content/img/upload-as-new-testruns.png -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServiceStackApps/HttpBenchmarks/HEAD/src/BenchmarksAnalyzer/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/MyInfo.cs: -------------------------------------------------------------------------------- 1 | using ServiceStack; 2 | 3 | namespace BenchmarksAnalyzer.ServiceModel 4 | { 5 | [Route("/myinfo")] 6 | public class MyInfo { } 7 | 8 | [Route("/reset")] 9 | public class Reset { } 10 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/Ping.cs: -------------------------------------------------------------------------------- 1 | using ServiceStack; 2 | 3 | namespace BenchmarksAnalyzer.ServiceModel 4 | { 5 | [Route("/ping")] 6 | public class Ping {} //healthcheck by AWS 7 | 8 | public class PingResponse 9 | { 10 | public string Result { get; set; } 11 | public ResponseStatus ResponseStatus { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/Types/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BenchmarksAnalyzer.ServiceModel.Types 2 | { 3 | public class UserInfo 4 | { 5 | public int Id { get; set; } 6 | public int UserAuthId { get; set; } 7 | public string DisplayName { get; set; } 8 | public string FirstName { get; set; } 9 | public string LastName { get; set; } 10 | public string ProfileUrl64 { get; set; } 11 | } 12 | } -------------------------------------------------------------------------------- /lib/ServiceStack.Authentication.OAuth2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ServiceStack.Authentication.OAuth2 5 | 6 | 7 | 8 | 9 | Create new App at: https://www.linkedin.com/secure/developer 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /servers/Techempower.AspNet/Views/Fortunes.cshtml: -------------------------------------------------------------------------------- 1 | @model List 2 | 3 | 4 | 5 | 6 | 7 | Fortunes 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | @foreach (var fortune in Model) 17 | { 18 | 19 | 20 | 21 | 22 | } 23 |
idmessage
@fortune.id@fortune.message
24 | 25 | 26 | -------------------------------------------------------------------------------- /servers/Techempower.SelfHost/Views/Fortunes.cshtml: -------------------------------------------------------------------------------- 1 | @inherits ViewPage> 2 | 3 | 4 | 5 | 6 | 7 | Fortunes 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | @foreach (var fortune in Model) 17 | { 18 | 19 | 20 | 21 | 22 | } 23 |
idmessage
@fortune.id@fortune.message
24 | 25 | 26 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener/Views/Fortunes.cshtml: -------------------------------------------------------------------------------- 1 | @inherits ViewPage> 2 | 3 | 4 | 5 | 6 | 7 | Fortunes 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | @foreach (var fortune in Model) 17 | { 18 | 19 | 20 | 21 | 22 | } 23 |
idmessage
@fortune.id@fortune.message
24 | 25 | 26 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.Pool/Views/Fortunes.cshtml: -------------------------------------------------------------------------------- 1 | @inherits ViewPage> 2 | 3 | 4 | 5 | 6 | 7 | Fortunes 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | @foreach (var fortune in Model) 17 | { 18 | 19 | 20 | 21 | 22 | } 23 |
idmessage
@fortune.id@fortune.message
24 | 25 | 26 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceInterface/ModelExtensions.cs: -------------------------------------------------------------------------------- 1 | using BenchmarksAnalyzer.ServiceModel.Types; 2 | using ServiceStack; 3 | 4 | namespace BenchmarksAnalyzer.ServiceInterface 5 | { 6 | public static class ModelExtensions 7 | { 8 | public static DisplayResult ToDisplayResult(this TestResult from) 9 | { 10 | var to = from.ConvertTo(); 11 | to.Host = from.Hostname; 12 | return to; 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.SmartPool/Views/Fortunes.cshtml: -------------------------------------------------------------------------------- 1 | @inherits ViewPage> 2 | 3 | 4 | 5 | 6 | 7 | Fortunes 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | @foreach (var fortune in Model) 17 | { 18 | 19 | 20 | 21 | 22 | } 23 |
idmessage
@fortune.id@fortune.message
24 | 25 | 26 | -------------------------------------------------------------------------------- /lib/ServiceStack.Authentication.OpenId.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ServiceStack.Authentication.OpenId 5 | 6 | 7 | 8 | 9 | Extracts an Attribute Exchange response, if one exists 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/Types/TestRun.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace BenchmarksAnalyzer.ServiceModel.Types 5 | { 6 | public class TestRun 7 | { 8 | [AutoIncrement] 9 | public int Id { get; set; } 10 | public int UserAuthId { get; set; } 11 | public int TestPlanId { get; set; } 12 | public string SeriesId { get; set; } 13 | public DateTime CreatedDate { get; set; } 14 | 15 | [Ignore] 16 | public int TestResultsCount { get; set; } 17 | } 18 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/HtmlExtensions.cs: -------------------------------------------------------------------------------- 1 | using BenchmarksAnalyzer.ServiceInterface; 2 | using ServiceStack.Razor; 3 | 4 | namespace BenchmarksAnalyzer 5 | { 6 | public static class HtmlExtensions 7 | { 8 | public static string ProfileUrl(this ViewPage view) 9 | { 10 | var session = view.SessionAs(); 11 | return session == null || session.ProfileUrl64 == null 12 | ? "/Content/img/no-profile-pic-64.png" 13 | : session.ProfileUrl64.Replace("http:",""); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/Types/TestPlan.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using ServiceStack.DataAnnotations; 4 | 5 | namespace BenchmarksAnalyzer.ServiceModel.Types 6 | { 7 | public class TestPlan 8 | { 9 | [AutoIncrement] 10 | public int Id { get; set; } 11 | public int UserAuthId { get; set; } 12 | public string Name { get; set; } 13 | public string Slug { get; set; } 14 | public Dictionary ServerLabels { get; set; } 15 | public Dictionary TestLabels { get; set; } 16 | public DateTime CreatedDate { get; set; } 17 | } 18 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceInterface/UserSession.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Runtime.Serialization; 3 | using ServiceStack; 4 | using ServiceStack.Auth; 5 | 6 | namespace BenchmarksAnalyzer.ServiceInterface 7 | { 8 | public class UserSession : AuthUserSession 9 | { 10 | [DataMember] 11 | public string ProfileUrl64 { get; set; } 12 | 13 | public override void OnAuthenticated(IServiceBase authService, IAuthSession session, 14 | IAuthTokens tokens, Dictionary authInfo) 15 | { 16 | base.OnAuthenticated(authService, session, tokens, authInfo); 17 | 18 | this.ProfileUrl64 = session.GetProfileUrl(); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceInterface/AdminServices.cs: -------------------------------------------------------------------------------- 1 | using BenchmarksAnalyzer.ServiceModel; 2 | using BenchmarksAnalyzer.ServiceModel.Types; 3 | using ServiceStack; 4 | using ServiceStack.Auth; 5 | using ServiceStack.OrmLite; 6 | 7 | namespace BenchmarksAnalyzer.ServiceInterface 8 | { 9 | [RequiredRole("Admin")] 10 | public class AdminServices : Service 11 | { 12 | public object Any(Reset request) 13 | { 14 | Db.DropAndCreateTable(); 15 | Db.DropAndCreateTable(); 16 | Db.DropAndCreateTable(); 17 | Db.DropAndCreateTable(); 18 | Db.DropAndCreateTable(); 19 | 20 | return "OK"; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceInterface/TestServices.cs: -------------------------------------------------------------------------------- 1 | using ServiceStack; 2 | 3 | namespace BenchmarksAnalyzer.ServiceInterface 4 | { 5 | //[Route("/corstest")] 6 | //[Route("/corstest/{Value}")] 7 | //public class CorsTest 8 | //{ 9 | // public string Value { get; set; } 10 | //} 11 | 12 | //public class TestServices : Service 13 | //{ 14 | // public object Any(CorsTest request) 15 | // { 16 | // string value = request.Value ?? "Bar"; 17 | // return new HttpResult(request) 18 | // { 19 | // Headers = { 20 | // { "X-Foo", value }, 21 | // { "Pragma", value }, 22 | // } 23 | // }; 24 | // } 25 | //} 26 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/TestRuns.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using BenchmarksAnalyzer.ServiceModel.Types; 3 | using ServiceStack; 4 | 5 | namespace BenchmarksAnalyzer.ServiceModel 6 | { 7 | [Route("/testplans/{TestPlanId}/testruns", "POST")] 8 | public class CreateTestRun : IReturn 9 | { 10 | public int TestPlanId { get; set; } 11 | public string SeriesId { get; set; } 12 | } 13 | 14 | [Route("/testruns/{Id}/delete", "POST DELETE")] 15 | public class DeleteTestRun 16 | { 17 | public int Id { get; set; } 18 | } 19 | 20 | [Route("/testplans/{TestPlanId}/testruns", "GET")] 21 | public class FindTestRuns : IReturn> 22 | { 23 | public int TestPlanId { get; set; } 24 | } 25 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/ViewTestPlan.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using BenchmarksAnalyzer.ServiceModel.Types; 3 | using ServiceStack; 4 | using ServiceStack.Text; 5 | 6 | namespace BenchmarksAnalyzer.ServiceModel 7 | { 8 | [FallbackRoute("/{Slug}")] 9 | public class ViewTestPlan : IReturn 10 | { 11 | public string Slug { get; set; } 12 | public int? Id { get; set; } 13 | } 14 | 15 | [Csv(CsvBehavior.FirstEnumerable)] 16 | public class ViewTestPlanResponse 17 | { 18 | public TestPlan TestPlan { get; set; } 19 | 20 | public TestRun TestRun { get; set; } 21 | 22 | public List Results { get; set; } 23 | 24 | public ResponseStatus ResponseStatus { get; set; } 25 | } 26 | } -------------------------------------------------------------------------------- /servers/Techempower.AspNet/Global.asax.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Funq; 3 | using ServiceStack; 4 | using ServiceStack.Configuration; 5 | using Techempower.ServiceInterface; 6 | 7 | namespace Techempower.AspNet 8 | { 9 | public class AppHost : AppHostBase 10 | { 11 | public AppHost() : base("Techempower Benchmarks", typeof(TechmeServices).Assembly) { } 12 | 13 | public override void Configure(Container container) 14 | { 15 | ConfigApp.AppHost(this, new AppSettings().Get("connection.DbProvider", DbProvider.InMemory)); 16 | } 17 | } 18 | 19 | public class Global : System.Web.HttpApplication 20 | { 21 | protected void Application_Start(object sender, EventArgs e) 22 | { 23 | new AppHost().Init(); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/Types/DisplayResult.cs: -------------------------------------------------------------------------------- 1 | namespace BenchmarksAnalyzer.ServiceModel.Types 2 | { 3 | public class DisplayResult 4 | { 5 | public int Id { get; set; } 6 | public string Software { get; set; } 7 | public string Host { get; set; } 8 | public int Port { get; set; } 9 | public string RequestPath { get; set; } 10 | public int RequestLength { get; set; } 11 | public int Concurrency { get; set; } 12 | public double TimeTaken { get; set; } 13 | public int TotalRequests { get; set; } 14 | public int FailedRequests { get; set; } 15 | public int TotalTransferred { get; set; } 16 | public int HtmlTransferred { get; set; } 17 | public double RequestsPerSec { get; set; } 18 | public double TimePerRequest { get; set; } 19 | public double TransferRate { get; set; } 20 | } 21 | } -------------------------------------------------------------------------------- /servers/Perf.ServiceInterface/PerfServices.cs: -------------------------------------------------------------------------------- 1 | using System.Threading; 2 | using ServiceStack; 3 | 4 | namespace Perf.SeviceInterface 5 | { 6 | public class SpinWait : IReturn 7 | { 8 | public int? Iterations { get; set; } 9 | } 10 | 11 | public class Sleep : IReturn 12 | { 13 | public int? ForMs { get; set; } 14 | } 15 | 16 | public class PerfServices : Service 17 | { 18 | private const int DefaultIterations = 1000 * 1000; 19 | private const int DefaultMs = 100; 20 | 21 | public object Any(SpinWait request) 22 | { 23 | Thread.SpinWait(request.Iterations.GetValueOrDefault(DefaultIterations)); 24 | return request; 25 | } 26 | 27 | public object Any(Sleep request) 28 | { 29 | Thread.Sleep(request.ForMs.GetValueOrDefault(DefaultMs)); 30 | return request; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/EditTestPlan.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using BenchmarksAnalyzer.ServiceModel.Types; 4 | using ServiceStack; 5 | 6 | namespace BenchmarksAnalyzer.ServiceModel 7 | { 8 | [Route("/testplans/{Id}/edit")] 9 | [Route("/testplans/{Id}/testruns/{TestRunId}/edit")] 10 | public class EditTestPlan : IReturn 11 | { 12 | public int Id { get; set; } 13 | public int? TestRunId { get; set; } 14 | } 15 | 16 | public class EditTestPlanResponse 17 | { 18 | public int Id { get; set; } 19 | public int? TestRunId { get; set; } 20 | public string Name { get; set; } 21 | public string Slug { get; set; } 22 | public Dictionary ServerLabels { get; set; } 23 | public Dictionary TestLabels { get; set; } 24 | public DateTime CreatedDate { get; set; } 25 | 26 | public ResponseStatus ResponseStatus { get; set; } 27 | } 28 | } -------------------------------------------------------------------------------- /servers/Perf.ServiceInterface/PerfAsyncServices.cs: -------------------------------------------------------------------------------- 1 | using System.Threading; 2 | using System.Threading.Tasks; 3 | using ServiceStack; 4 | 5 | namespace Perf.SeviceInterface 6 | { 7 | public class SpinWaitAsync : IReturn 8 | { 9 | public int? Iterations { get; set; } 10 | } 11 | 12 | public class SleepAsync : IReturn 13 | { 14 | public int? ForMs { get; set; } 15 | } 16 | 17 | public class PerfAsyncServices : Service 18 | { 19 | private const int DefaultIterations = 1000 * 1000; 20 | private const int DefaultMs = 100; 21 | 22 | public Task Any(SpinWaitAsync request) 23 | { 24 | return new Task( 25 | () => { 26 | Thread.SpinWait(request.Iterations.GetValueOrDefault(DefaultIterations)); 27 | return request; 28 | }); 29 | } 30 | 31 | public async Task Any(SleepAsync request) 32 | { 33 | await Task.Delay(request.ForMs.GetValueOrDefault(DefaultMs)); 34 | return request; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/TestPlans.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using BenchmarksAnalyzer.ServiceModel.Types; 3 | using ServiceStack; 4 | 5 | namespace BenchmarksAnalyzer.ServiceModel 6 | { 7 | [Route("/testplans", "POST")] 8 | public class CreateTestPlan : IReturn 9 | { 10 | public string Name { get; set; } 11 | public string Slug { get; set; } 12 | } 13 | 14 | [Route("/testplans/{Id}/delete", "POST DELETE")] 15 | public class DeleteTestPlan 16 | { 17 | public int Id { get; set; } 18 | } 19 | 20 | [Route("/testplans/{Id}/labels", "POST")] 21 | public class UpdateTestPlanLabels : IReturn 22 | { 23 | public int Id { get; set; } 24 | public string ServerLabels { get; set; } 25 | public string TestLabels { get; set; } 26 | 27 | public ResponseStatus ResponseStatus { get; set; } 28 | } 29 | 30 | [Route("/testplans", "GET")] 31 | public class FindTestPlans : IReturn> { } 32 | 33 | [Route("/testplans/{Id}")] 34 | public class GetTestPlan : IReturn 35 | { 36 | public int Id { get; set; } 37 | } 38 | } -------------------------------------------------------------------------------- /run-aspnet-db-benchmarks.bat: -------------------------------------------------------------------------------- 1 | SET HOST=localhost 2 | REM SET HOST=10.0.0.64 3 | SET REQUESTS=10000 4 | SET DB=Sqlite 5 | 6 | 7 | :AspNet 8 | SET PORT=55000 9 | SET PORT=55500 10 | SET ID=aspnet 11 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 12 | CALL :Benchmark 13 | 14 | GOTO End 15 | 16 | :Benchmark 17 | 18 | SET URL=http://%HOST%:%PORT% 19 | 20 | FOR %%A IN (fortunes updates queries) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\db_%DB%_%REQUESTS%_10_%%A_%ID%.txt 21 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 22 | FOR %%A IN (fortunes updates queries) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\db_%DB%_%REQUESTS%_100_%%A_%ID%.txt 23 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 24 | FOR %%A IN (fortunes updates queries) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\db_%DB%_%REQUESTS%_256_%%A_%ID%.txt 25 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 26 | 27 | ab -k -n %REQUESTS% -c 256 "%URL%/queries?queries=5" > results\db_%DB%_%REQUESTS%_256_queries5_%ID%.txt 28 | ab -k -n %REQUESTS% -c 256 "%URL%/queries?queries=10" > results\db_%DB%_%REQUESTS%_256_queries10_%ID%.txt 29 | ab -k -n %REQUESTS% -c 256 "%URL%/queries?queries=20" > results\db_%DB%_%REQUESTS%_256_queries20_%ID%.txt 30 | 31 | GOTO :EOF 32 | 33 | :End 34 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/Types/TestResult.cs: -------------------------------------------------------------------------------- 1 | using ServiceStack.DataAnnotations; 2 | 3 | namespace BenchmarksAnalyzer.ServiceModel.Types 4 | { 5 | public class TestResult 6 | { 7 | [AutoIncrement] 8 | public int Id { get; set; } 9 | public int UserAuthId { get; set; } 10 | public int TestPlanId { get; set; } 11 | public int TestRunId { get; set; } 12 | 13 | public string Software { get; set; } 14 | public string Hostname { get; set; } 15 | public int Port { get; set; } 16 | public string RequestPath { get; set; } 17 | public int RequestLength { get; set; } 18 | public int Concurrency { get; set; } 19 | public double TimeTaken { get; set; } 20 | public int TotalRequests { get; set; } 21 | public int FailedRequests { get; set; } 22 | public string FailedReasons { get; set; } 23 | public int TotalTransferred { get; set; } 24 | public int HtmlTransferred { get; set; } 25 | public double RequestsPerSec { get; set; } 26 | public double TimePerRequest { get; set; } 27 | public double TransferRate { get; set; } 28 | 29 | public string RawData { get; set; } 30 | } 31 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/GlimpseSecurityPolicy.cs: -------------------------------------------------------------------------------- 1 | /* 2 | // Uncomment this class to provide custom runtime policy for Glimpse 3 | 4 | using Glimpse.AspNet.Extensions; 5 | using Glimpse.Core.Extensibility; 6 | 7 | namespace BenchmarksAnalyzer 8 | { 9 | public class GlimpseSecurityPolicy:IRuntimePolicy 10 | { 11 | public RuntimePolicy Execute(IRuntimePolicyContext policyContext) 12 | { 13 | // You can perform a check like the one below to control Glimpse's permissions within your application. 14 | // More information about RuntimePolicies can be found at http://getglimpse.com/Help/Custom-Runtime-Policy 15 | // var httpContext = policyContext.GetHttpContext(); 16 | // if (!httpContext.User.IsInRole("Administrator")) 17 | // { 18 | // return RuntimePolicy.Off; 19 | // } 20 | 21 | return RuntimePolicy.On; 22 | } 23 | 24 | public RuntimeEvent ExecuteOn 25 | { 26 | // The RuntimeEvent.ExecuteResource is only needed in case you create a security policy 27 | // Have a look at http://blog.getglimpse.com/2013/12/09/protect-glimpse-axd-with-your-custom-runtime-policy/ for more details 28 | get { return RuntimeEvent.EndRequest | RuntimeEvent.ExecuteResource; } 29 | } 30 | } 31 | } 32 | */ -------------------------------------------------------------------------------- /servers/Techempower.HttpListener/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Funq; 3 | using ServiceStack; 4 | using ServiceStack.Text; 5 | using Techempower.ServiceInterface; 6 | 7 | namespace Techempower.HttpListener 8 | { 9 | public class AppHost : AppHostHttpListenerBase 10 | { 11 | private readonly DbProvider db; 12 | 13 | public AppHost(DbProvider db) 14 | : base("HttpListener Techempower Benchmarks", typeof(TechmeServices).Assembly) 15 | { 16 | this.db = db; 17 | } 18 | 19 | public override void Configure(Container container) 20 | { 21 | ConfigApp.AppHost(this, db); 22 | } 23 | } 24 | 25 | class Program 26 | { 27 | static void Main(string[] args) 28 | { 29 | DbProvider db; 30 | if (!(args.Length > 0 && Enum.TryParse(args[0], true, out db))) 31 | db = DbProvider.InMemory; 32 | 33 | new AppHost(db) 34 | .Init() 35 | .Start("http://*:55001/"); 36 | 37 | "\nHttpListener started with ThreadPool size of {0} using {1} listening on tcp port 55001" 38 | .Print(1, db); 39 | "Press Enter to Quit".Print(); 40 | Console.ReadLine(); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /servers/Techempower.SelfHost/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.Pool/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Properties/PublishProfiles/WebDeploy.pubxml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | MSDeploy 9 | Release 10 | Any CPU 11 | https://httpbenchmarks.servicestack.net 12 | True 13 | False 14 | awstest.servicestack.net 15 | BenchmarkAnalyzer 16 | 17 | True 18 | WMSVC 19 | True 20 | deploy 21 | <_SavePWD>True 22 | False 23 | 24 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.SmartPool/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /servers/Techempower.SelfHost/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Funq; 3 | using ServiceStack; 4 | using ServiceStack.Text; 5 | using Techempower.ServiceInterface; 6 | 7 | namespace Techempower.SelfHost 8 | { 9 | public class AppHost : AppSelfHostBase 10 | { 11 | private readonly DbProvider db; 12 | 13 | public AppHost(DbProvider db) 14 | : base("SelfHost Techempower Benchmarks", typeof(TechmeServices).Assembly) 15 | { 16 | this.db = db; 17 | } 18 | 19 | public override void Configure(Container container) 20 | { 21 | ConfigApp.AppHost(this, db); 22 | 23 | this.PreRequestFilters.Add((req, res) => 24 | { 25 | res.UseBufferedStream = true; 26 | }); 27 | } 28 | } 29 | 30 | class Program 31 | { 32 | static void Main(string[] args) 33 | { 34 | DbProvider db; 35 | if (!(args.Length > 0 && Enum.TryParse(args[0], true, out db))) 36 | db = DbProvider.InMemory; 37 | 38 | new AppHost(db) 39 | .Init() 40 | .Start("http://*:55004/"); 41 | 42 | "\nSelfAppHost started using {0} listening on tcp port 55004" 43 | .Print(db); 44 | "Press Enter to Quit".Print(); 45 | Console.ReadLine(); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /servers/Techempower.AspNet/Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /servers/Techempower.SelfHost/Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener/Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.Pool/Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Content/default.css: -------------------------------------------------------------------------------- 1 | body { 2 | color: #444; 3 | } 4 | #body { 5 | padding: 0 20px; 6 | } 7 | .error { 8 | } 9 | a.disabled,span.disabled,a.disabled:hover { 10 | color: #999; 11 | cursor: text; 12 | text-decoration: none; 13 | } 14 | .help-block.error, .note.error, .notes.error { 15 | color: #f00; 16 | } 17 | input.error { 18 | background: #FFD9D9; 19 | border: 1px solid #f00; 20 | } 21 | input { 22 | border: 1px solid #cdcdcd; 23 | } 24 | input:hover { 25 | border: 1px solid #b9b9b9; 26 | } 27 | input:focus { 28 | border: 1px solid #4285f4; 29 | } 30 | .error-summary { 31 | display: none; 32 | } 33 | .has-errors .error-summary, .validation .error-summary { 34 | display: block; 35 | } 36 | 37 | #modalLogin .modal-title { 38 | font-size: 18px; 39 | } 40 | #modalLogin .modal-body label { 41 | display: block; 42 | } 43 | #modalLogin .modal-body div { 44 | display: inline-block; 45 | } 46 | #modalLogin .modal-body input { 47 | width: 260px; 48 | padding: 5px; 49 | margin: 0 7px 0 0; 50 | } 51 | 52 | .when-auth, .when-anon { 53 | display: none; 54 | } 55 | a, span[data-click],span[data-trigger] { 56 | color: #428bca; 57 | cursor: pointer; 58 | } 59 | a:hover, span[data-click]:hover,span[data-trigger]:hover { 60 | color: #2a6496; 61 | } 62 | li.active a, li.active a:hover { 63 | color: #444; 64 | font-weight: bold; 65 | } -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.SmartPool/Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/SearchTestResults.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using BenchmarksAnalyzer.ServiceModel.Types; 3 | using ServiceStack; 4 | using ServiceStack.Text; 5 | 6 | namespace BenchmarksAnalyzer.ServiceModel 7 | { 8 | [Route("/testplans/{TestPlanId}/results", "GET")] 9 | [Route("/testplans/{TestPlanId}/testruns/{TestRunId}/results", "GET")] 10 | public class SearchTestResults : IReturn 11 | { 12 | public int TestPlanId { get; set; } 13 | public int? TestRunId { get; set; } 14 | 15 | public int? Skip { get; set; } 16 | public int? Take { get; set; } 17 | public string Host { get; set; } 18 | public int? Port { get; set; } 19 | public string RequestPath { get; set; } 20 | } 21 | 22 | [Csv(CsvBehavior.FirstEnumerable)] 23 | public class SearchTestResultsResponse 24 | { 25 | public int TestPlanId { get; set; } 26 | public int? TestRunId { get; set; } 27 | 28 | public int? Skip { get; set; } 29 | public int? Take { get; set; } 30 | public string Host { get; set; } 31 | public int? Port { get; set; } 32 | public string RequestPath { get; set; } 33 | 34 | public int Total { get; set; } 35 | 36 | public List Results { get; set; } 37 | 38 | public ResponseStatus ResponseStatus { get; set; } 39 | } 40 | } -------------------------------------------------------------------------------- /servers/Techempower.AspNet/Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /servers/Techempower.SelfHost/Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener/Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.Pool/Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.SmartPool/Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/UploadTestResults.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using BenchmarksAnalyzer.ServiceModel.Types; 3 | using ServiceStack; 4 | 5 | namespace BenchmarksAnalyzer.ServiceModel 6 | { 7 | [Route("/testplans/{TestPlanId}/upload", "POST")] 8 | [Route("/testplans/{TestPlanId}/testruns/{TestRunId}/upload", "POST")] 9 | public class UploadTestResults : IReturn> 10 | { 11 | public int TestPlanId { get; set; } 12 | public int? TestRunId { get; set; } 13 | public bool CreateNewTestRuns { get; set; } 14 | } 15 | 16 | public class UploadTestResultsResponse 17 | { 18 | public bool success { get; set; } 19 | public TestRun TestRun { get; set; } 20 | public List Results { get; set; } 21 | public ResponseStatus ResponseStatus { get; set; } 22 | } 23 | 24 | [Route("/testplans/{TestPlanId}/testresults", "POST")] 25 | [Route("/testplans/{TestPlanId}/testruns/{TestRunId}/testresults", "POST")] 26 | public class AddTestResults : IReturn> 27 | { 28 | public int TestPlanId { get; set; } 29 | public int? TestRunId { get; set; } 30 | public string Contents { get; set; } 31 | } 32 | 33 | public class AddTestResultsResponse 34 | { 35 | public TestRun TestRun { get; set; } 36 | public List Results { get; set; } 37 | public ResponseStatus ResponseStatus { get; set; } 38 | } 39 | } -------------------------------------------------------------------------------- /run-aspnet-benchmarks.bat: -------------------------------------------------------------------------------- 1 | SET HOST=localhost 2 | REM SET HOST=10.0.0.64 3 | SET REQUESTS=10000 4 | 5 | 6 | 7 | :AspNet 8 | SET PORT=55000 9 | SET ID=aspnet 10 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 11 | CALL :Benchmark 12 | 13 | GOTO End 14 | 15 | :Benchmark 16 | 17 | SET URL=http://%HOST%:%PORT% 18 | 19 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\raw_%REQUESTS%_10_%%A_%ID%.txt 20 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 21 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\raw_%REQUESTS%_100_%%A_%ID%.txt 22 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 23 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\raw_%REQUESTS%_256_%%A_%ID%.txt 24 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 25 | ab -k -n %REQUESTS% -c 1000 "%URL%/plaintext" > results\raw_10000_1000_plaintext_%ID%.txt 26 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 27 | 28 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\db_%REQUESTS%_10_%%A_%ID%.txt 29 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 30 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\db_%REQUESTS%_100_%%A_%ID%.txt 31 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 32 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\db_%REQUESTS%_256_%%A_%ID%.txt 33 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 34 | 35 | GOTO :EOF 36 | 37 | :End 38 | -------------------------------------------------------------------------------- /servers/Techempower.AspNet/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Perf.AspNet")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Perf.AspNet")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("81825cab-6e48-41fb-a2db-81a0dc7e8ca0")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Revision and Build Numbers 33 | // by using the '*' as shown below: 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("BenchmarksAnalyzer")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("BenchmarksAnalyzer")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("4ea25871-7acd-4b3f-b5e7-7ef033db2bd8")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Revision and Build Numbers 33 | // by using the '*' as shown below: 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.SmartPool/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Funq; 3 | using ServiceStack; 4 | using ServiceStack.Text; 5 | using Techempower.ServiceInterface; 6 | 7 | namespace Techempower.HttpListener.SmartPool 8 | { 9 | public class AppHost : AppHostHttpListenerSmartPoolBase 10 | { 11 | private readonly DbProvider db; 12 | 13 | public AppHost(int poolSize, DbProvider db) 14 | : base("SmartPool Techempower Benchmarks", poolSize, typeof(TechmeServices).Assembly) 15 | { 16 | this.db = db; 17 | } 18 | 19 | public override void Configure(Container container) 20 | { 21 | ConfigApp.AppHost(this, db); 22 | } 23 | } 24 | 25 | class Program 26 | { 27 | static void Main(string[] args) 28 | { 29 | int poolSize; 30 | if (!(args.Length > 0 && int.TryParse(args[0], out poolSize))) 31 | poolSize = AppHostHttpListenerBase.CalculatePoolSize(); 32 | 33 | DbProvider db; 34 | if (!(args.Length > 1 && Enum.TryParse(args[1], true, out db))) 35 | db = DbProvider.InMemory; 36 | 37 | new AppHost(poolSize, db) 38 | .Init() 39 | .Start("http://*:55003/"); 40 | 41 | "\nSmartPool started with ThreadPool size of {0} using {1} listening on tcp port 55003" 42 | .Print(poolSize, db); 43 | "Press Enter to Quit".Print(); 44 | Console.ReadLine(); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.Pool/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Funq; 3 | using ServiceStack; 4 | using ServiceStack.Text; 5 | using Techempower.ServiceInterface; 6 | 7 | namespace Techempower.HttpListener.Pool 8 | { 9 | public class AppHost : AppHostHttpListenerPoolBase 10 | { 11 | private readonly DbProvider db; 12 | 13 | public AppHost(int poolSize, DbProvider db) 14 | : base("HttpListener Pool Techempower Benchmarks", poolSize, typeof (TechmeServices).Assembly) 15 | { 16 | this.db = db; 17 | } 18 | 19 | public override void Configure(Container container) 20 | { 21 | ConfigApp.AppHost(this, db); 22 | } 23 | } 24 | 25 | class Program 26 | { 27 | static void Main(string[] args) 28 | { 29 | int poolSize; 30 | if (!(args.Length > 0 && int.TryParse(args[0], out poolSize))) 31 | poolSize = AppHostHttpListenerBase.CalculatePoolSize(); 32 | 33 | DbProvider db; 34 | if (!(args.Length > 1 && Enum.TryParse(args[1], true, out db))) 35 | db = DbProvider.InMemory; 36 | 37 | new AppHost(poolSize, db) 38 | .Init() 39 | .Start("http://*:55002/"); 40 | 41 | "\nHttpListener Pool started with ThreadPool size of {0} using {1} listening on tcp port 55002" 42 | .Print(poolSize, db); 43 | "Press Enter to Quit".Print(); 44 | Console.ReadLine(); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /tests/Perf.Tests/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Perf.Tests")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Perf.Tests")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("9257447d-56be-4c00-b33b-783c459e4a27")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Perf.HttpListener")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Perf.HttpListener")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("d5e84e9c-f96e-4193-8edf-9ff27a7a85a8")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /servers/Techempower.SelfHost/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Techempower.SelfHost")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Techempower.SelfHost")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("34a9d77e-af42-4362-8669-42465d60a80e")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /servers/Perf.ServiceInterface/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Perf.SeviceInterface")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Perf.SeviceInterface")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("d19a09a2-9d20-470b-b59f-020b5a215c6e")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.Pool/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Perf.HttpListener.Pool")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Perf.HttpListener.Pool")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("e31b241a-543a-4e75-9e8a-9d6408f3492f")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /servers/Techempower.ServiceInterface/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Techme.ServiceInterface")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Techme.ServiceInterface")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("8c3b7ff0-828d-4291-be1e-c5e78d4ce0e7")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceInterface/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("BenchmarksAnalyzer.Logic")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("BenchmarksAnalyzer.Logic")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("da5f9c0d-d574-496e-839f-4437a0a9c19b")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("BenchmarksAnalyzer.ServiceModel")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("BenchmarksAnalyzer.ServiceModel")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("b431302b-83a4-408c-b9f0-9459820d1fc9")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.SmartPool/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Perf.HttpListener.SmartThreads")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Perf.HttpListener.SmartThreads")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("fafde1ef-709e-42fa-ad49-a703a33d4f8e")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /run-selfhost-benchmarks.bat: -------------------------------------------------------------------------------- 1 | SET HOST=localhost 2 | REM SET HOST=10.0.0.64 3 | SET REQUESTS=10000 4 | SET DB=SqlServer 5 | 6 | 7 | :SelfHost 8 | SET PORT=55004 9 | SET ID=selfhost 10 | START servers\Techempower.SelfHost\bin\Release\Techempower.SelfHost.exe %DB% 11 | ab -n 1 "http://%HOST%:%PORT%/reset/full" > nul 12 | CALL :Benchmark 13 | taskkill /f /im Techempower.SelfHost.exe 14 | 15 | GOTO End 16 | 17 | :Benchmark 18 | 19 | SET URL=http://%HOST%:%PORT% 20 | 21 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\raw_%REQUESTS%_10_%%A_%ID%.txt 22 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 23 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\raw_%REQUESTS%_100_%%A_%ID%.txt 24 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 25 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\raw_%REQUESTS%_256_%%A_%ID%.txt 26 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 27 | ab -k -n %REQUESTS% -c 1000 "%URL%/plaintext" > results\raw_10000_1000_plaintext_%ID%.txt 28 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 29 | 30 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\db_%REQUESTS%_10_%%A_%ID%.txt 31 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 32 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\db_%REQUESTS%_100_%%A_%ID%.txt 33 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 34 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\db_%REQUESTS%_256_%%A_%ID%.txt 35 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 36 | 37 | GOTO :EOF 38 | 39 | :End 40 | -------------------------------------------------------------------------------- /run-httplistener-benchmarks.bat: -------------------------------------------------------------------------------- 1 | SET HOST=localhost 2 | REM SET HOST=10.0.0.64 3 | SET REQUESTS=10000 4 | SET DB=SqlServer 5 | 6 | 7 | :HttpListener 8 | SET PORT=55001 9 | SET ID=httplistener 10 | START servers\Techempower.HttpListener\bin\Release\Techempower.HttpListener.exe %DB% 11 | ping -n 3 127.0.0.1 > nul 12 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 13 | CALL :Benchmark 14 | taskkill /f /im Techempower.HttpListener.exe 15 | 16 | GOTO End 17 | 18 | :Benchmark 19 | 20 | SET URL=http://%HOST%:%PORT% 21 | 22 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\raw_%REQUESTS%_10_%%A_%ID%.txt 23 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 24 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\raw_%REQUESTS%_100_%%A_%ID%.txt 25 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 26 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\raw_%REQUESTS%_256_%%A_%ID%.txt 27 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 28 | ab -k -n %REQUESTS% -c 1000 "%URL%/plaintext" > results\raw_10000_1000_plaintext_%ID%.txt 29 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 30 | 31 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\db_%REQUESTS%_10_%%A_%ID%.txt 32 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 33 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\db_%REQUESTS%_100_%%A_%ID%.txt 34 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 35 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\db_%REQUESTS%_256_%%A_%ID%.txt 36 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 37 | 38 | GOTO :EOF 39 | 40 | :End 41 | -------------------------------------------------------------------------------- /run-httplistenerpool-benchmarks.bat: -------------------------------------------------------------------------------- 1 | SET HOST=localhost 2 | REM SET HOST=10.0.0.64 3 | SET REQUESTS=10000 4 | SET THREADPOOL=64 5 | SET DB=SqlServer 6 | 7 | :HttpListenerPool 8 | SET PORT=55002 9 | SET ID=httplistenerpool 10 | START servers\Techempower.HttpListener.Pool\bin\Release\Techempower.HttpListener.Pool.exe %THREADPOOL% %DB% 11 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 12 | CALL :Benchmark 13 | taskkill /f /im Techempower.HttpListener.Pool.exe 14 | 15 | GOTO End 16 | 17 | :Benchmark 18 | 19 | SET URL=http://%HOST%:%PORT% 20 | 21 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\raw_%REQUESTS%_10_%%A_%ID%.txt 22 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 23 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\raw_%REQUESTS%_100_%%A_%ID%.txt 24 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 25 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\raw_%REQUESTS%_256_%%A_%ID%.txt 26 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 27 | ab -k -n %REQUESTS% -c 1000 "%URL%/plaintext" > results\raw_10000_1000_plaintext_%ID%.txt 28 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 29 | 30 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\db_%REQUESTS%_10_%%A_%ID%.txt 31 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 32 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\db_%REQUESTS%_100_%%A_%ID%.txt 33 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 34 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\db_%REQUESTS%_256_%%A_%ID%.txt 35 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 36 | 37 | GOTO :EOF 38 | 39 | :End 40 | -------------------------------------------------------------------------------- /lib/copy.bat: -------------------------------------------------------------------------------- 1 | COPY C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite.PostgreSQL\bin\Release\ServiceStack.OrmLite.* 2 | COPY C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite.PostgreSQL\bin\Release\Mono.Security.dll 3 | COPY C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite.PostgreSQL\bin\Release\Npgsql.dll 4 | 5 | COPY C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite.MySql\bin\Release\ServiceStack.OrmLite.MySql.* 6 | COPY C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite.MySql\bin\Release\MySql.Data.* 7 | 8 | COPY C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite.SqlServer\bin\Release\ServiceStack.OrmLite.SqlServer.* 9 | 10 | COPY C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite.Sqlite\bin\Release\ServiceStack.OrmLite.Sqlite.* 11 | COPY C:\src\ServiceStack\lib\Mono.Data.Sqlite.dll . 12 | COPY C:\src\ServiceStack\lib\sqlite3.dll . 13 | 14 | COPY C:\src\ServiceStack.Redis\src\ServiceStack.Redis\bin\Release\ServiceStack.Redis.* . 15 | 16 | COPY C:\src\ServiceStack\src\ServiceStack.Authentication.OAuth2\bin\Release\ServiceStack.Authentication.OAuth2.* . 17 | COPY C:\src\ServiceStack\src\ServiceStack.Authentication.OAuth2\bin\Release\DotNetOpenAuth.* . 18 | 19 | COPY C:\src\ServiceStack\src\ServiceStack.Authentication.OpenId\bin\Release\ServiceStack.Authentication.OpenId.* . 20 | 21 | COPY C:\src\ServiceStack\src\ServiceStack.Logging.Log4Net\bin\Release\ServiceStack.Logging.Log4Net.* . 22 | 23 | COPY C:\src\ServiceStack\src\ServiceStack.Api.Swagger\bin\Release\ServiceStack.Api.Swagger.* . 24 | COPY C:\src\ServiceStack\src\ServiceStack.Server\bin\Release\ServiceStack.Server.* . 25 | COPY C:\src\ServiceStack\src\ServiceStack.Razor\bin\Release\* . 26 | 27 | COPY C:\src\Stripe\src\Stripe\StripeGateway.cs C:\src\Licensing\www.logic\ -------------------------------------------------------------------------------- /run-smartpool-benchmarks.bat: -------------------------------------------------------------------------------- 1 | SET HOST=localhost 2 | REM SET HOST=10.0.0.64 3 | SET REQUESTS=10000 4 | SET THREADPOOL=16 5 | SET DB=SqlServer 6 | 7 | :SmartPool 8 | SET PORT=55003 9 | SET ID=httplistenersmartpool 10 | START servers\Techempower.HttpListener.SmartPool\bin\Release\Techempower.HttpListener.SmartPool.exe %THREADPOOL% %DB% 11 | ab -n 1 "http://%HOST%:%PORT%/reset/full" > nul 12 | CALL :Benchmark 13 | taskkill /f /im Techempower.HttpListener.SmartPool.exe 14 | 15 | GOTO End 16 | 17 | :Benchmark 18 | 19 | SET URL=http://%HOST%:%PORT% 20 | 21 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\raw_%REQUESTS%_10_%%A_%ID%.txt 22 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 23 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\raw_%REQUESTS%_100_%%A_%ID%.txt 24 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 25 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\raw_%REQUESTS%_256_%%A_%ID%.txt 26 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 27 | ab -k -n %REQUESTS% -c 1000 "%URL%/plaintext" > results\raw_10000_1000_plaintext_%ID%.txt 28 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 29 | 30 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\db_%REQUESTS%_10_%%A_%ID%.txt 31 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 32 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\db_%REQUESTS%_100_%%A_%ID%.txt 33 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 34 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\db_%REQUESTS%_256_%%A_%ID%.txt 35 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 36 | 37 | GOTO :EOF 38 | 39 | :End 40 | -------------------------------------------------------------------------------- /run-all-raw-benchmarks.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | SET HOST=localhost 3 | REM SET HOST=10.0.0.64 4 | SET REQUESTS=10000 5 | SET THREADPOOL=128 6 | SET DB=SqlServer 7 | 8 | :AspNet 9 | SET PORT=55000 10 | SET ID=aspnet 11 | ab -n 1 "http://%HOST%:%PORT%/reset" 12 | CALL :Benchmark 13 | 14 | :HttpListener 15 | SET PORT=55001 16 | SET ID=httplistener 17 | START servers\Techempower.HttpListener\bin\Release\Techempower.HttpListener.exe %DB% 18 | ping -n 3 127.0.0.1 > nul 19 | ab -n 1 "http://%HOST%:%PORT%/reset" 20 | CALL :Benchmark 21 | taskkill /f /im Techempower.HttpListener.exe 22 | 23 | :HttpListenerPool 24 | SET PORT=55002 25 | SET ID=httplistenerpool 26 | START servers\Techempower.HttpListener.Pool\bin\Release\Techempower.HttpListener.Pool.exe 64 %DB% 27 | ping -n 3 127.0.0.1 > nul 28 | ab -n 1 "http://%HOST%:%PORT%/reset" 29 | CALL :Benchmark 30 | taskkill /f /im Techempower.HttpListener.Pool.exe 31 | 32 | :SmartPool 33 | SET PORT=55003 34 | SET ID=httplistenersmartpool 35 | START servers\Techempower.HttpListener.SmartPool\bin\Release\Techempower.HttpListener.SmartPool.exe 16 %DB% 36 | ping -n 3 127.0.0.1 > nul 37 | ab -n 1 "http://%HOST%:%PORT%/reset" 38 | CALL :Benchmark 39 | taskkill /f /im Techempower.HttpListener.SmartPool.exe 40 | 41 | GOTO End 42 | 43 | :Benchmark 44 | 45 | SET URL=http://%HOST%:%PORT% 46 | 47 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\raw_%REQUESTS%_10_%%A_%ID%.txt 48 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\raw_%REQUESTS%_100_%%A_%ID%.txt 49 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\raw_%REQUESTS%_256_%%A_%ID%.txt 50 | ab -k -n %REQUESTS% -c 1000 "%URL%/plaintext" > results\raw_10000_1000_plaintext_%ID%.txt 51 | 52 | GOTO :EOF 53 | 54 | :End 55 | -------------------------------------------------------------------------------- /run-all-db-benchmarks.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | SET HOST=localhost 3 | REM SET HOST=10.0.0.64 4 | SET REQUESTS=10000 5 | SET DB=SqlServer 6 | 7 | :AspNet 8 | SET PORT=55000 9 | SET ID=aspnet 10 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 11 | CALL :Benchmark 12 | 13 | :HttpListener 14 | SET PORT=55001 15 | SET ID=httplistener 16 | START servers\Techempower.HttpListener\bin\Release\Techempower.HttpListener.exe %DB% 17 | ping -n 3 127.0.0.1 > nul 18 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 19 | CALL :Benchmark 20 | taskkill /f /im Techempower.HttpListener.exe 21 | 22 | :HttpListenerPool 23 | SET PORT=55002 24 | SET ID=httplistenerpool 25 | START servers\Techempower.HttpListener.Pool\bin\Release\Techempower.HttpListener.Pool.exe 64 %DB% 26 | ping -n 3 127.0.0.1 > nul 27 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 28 | CALL :Benchmark 29 | taskkill /f /im Techempower.HttpListener.Pool.exe 30 | 31 | :SmartPool 32 | SET PORT=55003 33 | SET ID=httplistenersmartpool 34 | START servers\Techempower.HttpListener.SmartPool\bin\Release\Techempower.HttpListener.SmartPool.exe 16 %DB% 35 | ping -n 3 127.0.0.1 > nul 36 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 37 | CALL :Benchmark 38 | taskkill /f /im Techempower.HttpListener.SmartPool.exe 39 | 40 | GOTO End 41 | 42 | :Benchmark 43 | 44 | SET URL=http://%HOST%:%PORT% 45 | 46 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\db_%REQUESTS%_10_%%A_%ID%.txt 47 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 48 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\db_%REQUESTS%_100_%%A_%ID%.txt 49 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 50 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\db_%REQUESTS%_256_%%A_%ID%.txt 51 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 52 | 53 | GOTO :EOF 54 | 55 | :End 56 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /tests/Perf.Tests/PerfTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using NUnit.Framework; 4 | using ServiceStack; 5 | using ServiceStack.Text; 6 | 7 | namespace Perf.Tests 8 | { 9 | [TestFixture] 10 | public class PerfTests 11 | { 12 | [Test] 13 | public void Benchmark_AspNet() 14 | { 15 | "ASP.NET".Print(); 16 | Benchmark("http://localhost:55000/"); 17 | 18 | "HttpListener".Print(); 19 | Benchmark("http://localhost:55001/"); 20 | 21 | "HttpListenerPool".Print(); 22 | Benchmark("http://localhost:55002/"); 23 | 24 | "HttpListenerSmartPool".Print(); 25 | Benchmark("http://localhost:55003/"); 26 | } 27 | 28 | public void Benchmark(string baseUrl) 29 | { 30 | MeasureUrl(baseUrl.AppendPath("json")); 31 | MeasureUrl(baseUrl.AppendPath("db")); 32 | MeasureUrl(baseUrl.AppendPath("queries")); 33 | MeasureUrl(baseUrl.AppendPath("fortunes")); 34 | MeasureUrl(baseUrl.AppendPath("updates")); 35 | MeasureUrl(baseUrl.AppendPath("plaintext")); 36 | } 37 | 38 | public void MeasureUrl(string url) 39 | { 40 | var errors = new List(); 41 | var bytesDownloaded = 0; 42 | var microSecs = PerfUtils.Measure(() => 43 | { 44 | try 45 | { 46 | var download = url.GetBytesFromUrl(); 47 | bytesDownloaded += download.Length; 48 | } 49 | catch (Exception ex) 50 | { 51 | errors.Add(ex); 52 | } 53 | }, 54 | times: 1, 55 | runForMs: 2000); 56 | 57 | if (errors.Count > 0) 58 | errors.Map(x => x.Message).ToHashSet().PrintDump(); 59 | 60 | "{0} took avg of {1}us with and had {2} errors ({3} bytes downloaded)" 61 | .Print(url, microSecs, errors.Count, bytesDownloaded); 62 | } 63 | 64 | } 65 | } 66 | 67 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build Folders (you can keep bin if you'd like, to store dlls and pdbs) 2 | [Bb]in/ 3 | [Oo]bj/ 4 | .idea/ 5 | .vs/ 6 | 7 | # mstest test results 8 | TestResults 9 | 10 | ## Ignore Visual Studio temporary files, build results, and 11 | ## files generated by popular Visual Studio add-ons. 12 | 13 | # User-specific files 14 | *.suo 15 | *.user 16 | *.sln.docstates 17 | *.secrets.cs 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Rr]elease/ 22 | deploy/ 23 | x64/ 24 | *_i.c 25 | *_p.c 26 | *.ilk 27 | *.meta 28 | *.obj 29 | *.pch 30 | *.pdb 31 | *.pgc 32 | *.pgd 33 | *.rsp 34 | *.sbr 35 | *.tlb 36 | *.tli 37 | *.tlh 38 | *.tmp 39 | *.log 40 | *.txt 41 | *.vspscc 42 | *.vssscc 43 | .builds 44 | 45 | # Visual C++ cache files 46 | ipch/ 47 | *.aps 48 | *.ncb 49 | *.opensdf 50 | *.sdf 51 | 52 | # Visual Studio profiler 53 | *.psess 54 | *.vsp 55 | *.vspx 56 | 57 | # Guidance Automation Toolkit 58 | *.gpState 59 | 60 | # ReSharper is a .NET coding add-in 61 | _ReSharper* 62 | 63 | # NCrunch 64 | *.ncrunch* 65 | .*crunch*.local.xml 66 | 67 | # Installshield output folder 68 | [Ee]xpress 69 | 70 | # DocProject is a documentation generator add-in 71 | DocProject/buildhelp/ 72 | DocProject/Help/*.HxT 73 | DocProject/Help/*.HxC 74 | DocProject/Help/*.hhc 75 | DocProject/Help/*.hhk 76 | DocProject/Help/*.hhp 77 | DocProject/Help/Html2 78 | DocProject/Help/html 79 | 80 | # Click-Once directory 81 | publish 82 | 83 | # Publish Web Output 84 | *.Publish.xml 85 | 86 | # NuGet Packages Directory 87 | packages 88 | 89 | # Windows Azure Build Output 90 | csx 91 | *.build.csdef 92 | 93 | # Windows Store app package directory 94 | AppPackages/ 95 | 96 | # Others 97 | [Bb]in 98 | [Oo]bj 99 | sql 100 | *.Cache 101 | ClientBin 102 | [Ss]tyle[Cc]op.* 103 | ~$* 104 | *.dbmdl 105 | 106 | Generated_Code #added for RIA/Silverlight projects 107 | 108 | # Backup & report files from converting an old project file to a newer 109 | # Visual Studio version. Backup files are not needed, because we have git ;-) 110 | _UpgradeReport_Files/ 111 | Backup*/ 112 | UpgradeLog*.XML 113 | 114 | ssl/ 115 | *.crt 116 | *.ssl 117 | *.pem 118 | results/ 119 | teststub.* 120 | *.sqlite 121 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Views/SearchTestResults.cshtml: -------------------------------------------------------------------------------- 1 | @inherits ViewPage 2 | @if (RenderErrorIfAny()) { return; } 3 | 4 |
5 |
6 | download in: 7 | 8 | json 9 | csv 10 | xml 11 | jsv 12 | 13 | 14 | @if (IsAuthenticated) 15 | { 16 | Edit Plan 17 | } 18 |
19 |
20 | 21 |
22 |
23 |
24 |

Filter Results

25 |
26 |
27 | 28 |
29 |
30 | 31 |
32 |
33 | 34 |
35 |
36 | 37 |
38 | 39 |
40 | 41 | showing @Model.Take.GetValueOrDefault(Model.Total) results: 42 | 43 |
44 |
45 |
46 | 47 |
48 | 49 | 60 | 61 | @Html.Partial("AutoGrid", Model.Results) -------------------------------------------------------------------------------- /run-all-benchmarks.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | SET HOST=localhost 3 | REM SET HOST=10.0.0.64 4 | SET REQUESTS=10000 5 | SET DB=SqlServer 6 | 7 | :AspNet 8 | SET PORT=55000 9 | SET ID=aspnet 10 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 11 | CALL :Benchmark 12 | 13 | :HttpListener 14 | SET PORT=55001 15 | SET ID=httplistener 16 | START servers\Techempower.HttpListener\bin\Release\Techempower.HttpListener.exe %DB% 17 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 18 | CALL :Benchmark 19 | taskkill /f /im Techempower.HttpListener.exe 20 | 21 | :HttpListenerPool 22 | SET PORT=55002 23 | SET ID=httplistenerpool 24 | START servers\Techempower.HttpListener.Pool\bin\Release\Techempower.HttpListener.Pool.exe 64 %DB% 25 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 26 | CALL :Benchmark 27 | taskkill /f /im Techempower.HttpListener.Pool.exe 28 | 29 | :SmartPool 30 | SET PORT=55003 31 | SET ID=httplistenersmartpool 32 | START servers\Techempower.HttpListener.SmartPool\bin\Release\Techempower.HttpListener.SmartPool.exe 16 %DB% 33 | ab -n 1 "http://%HOST%:%PORT%/reset/full" 34 | CALL :Benchmark 35 | taskkill /f /im Techempower.HttpListener.SmartPool.exe 36 | 37 | GOTO End 38 | 39 | :Benchmark 40 | 41 | SET URL=http://%HOST%:%PORT% 42 | 43 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\raw_%REQUESTS%_10_%%A_%ID%.txt 44 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 45 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\raw_%REQUESTS%_100_%%A_%ID%.txt 46 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 47 | FOR %%A IN (json plaintext) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\raw_%REQUESTS%_256_%%A_%ID%.txt 48 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 49 | ab -k -n %REQUESTS% -c 1000 "%URL%/plaintext" > results\raw_10000_1000_plaintext_%ID%.txt 50 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 51 | 52 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 10 "%URL%/%%A" > results\db_%REQUESTS%_10_%%A_%ID%.txt 53 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 54 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 100 "%URL%/%%A" > results\db_%REQUESTS%_100_%%A_%ID%.txt 55 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 56 | FOR %%A IN (db queries fortunes updates) DO ab -k -n %REQUESTS% -c 256 "%URL%/%%A" > results\db_%REQUESTS%_256_%%A_%ID%.txt 57 | ab -n 1 "http://%HOST%:%PORT%/reset/gc" > nul 58 | 59 | GOTO :EOF 60 | 61 | :End 62 | -------------------------------------------------------------------------------- /servers/Techempower.SelfHost/Web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 11 | 12 |
13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.SmartPool/Web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 11 | 12 |
13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener/Web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.Pool/Web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /servers/Techempower.AspNet/Web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceInterface/WebServices.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using BenchmarksAnalyzer.ServiceModel; 4 | using BenchmarksAnalyzer.ServiceModel.Types; 5 | using ServiceStack; 6 | using ServiceStack.OrmLite; 7 | 8 | namespace BenchmarksAnalyzer.ServiceInterface 9 | { 10 | public class WebServices : Service 11 | { 12 | public object Any(Ping request) 13 | { 14 | var status = ""; 15 | status += Db.Count() > 0 ? "DB OK" : "DB FAIL"; 16 | return new PingResponse { 17 | Result = status, 18 | }; 19 | } 20 | 21 | public TestPlan Any(GetTestPlan request) 22 | { 23 | var plan = Db.SingleById(request.Id); 24 | 25 | if (plan == null) 26 | throw HttpError.NotFound("Plan {0} does not exist".Fmt(request.Id)); 27 | 28 | return plan; 29 | } 30 | 31 | public object Any(SearchTestResults request) 32 | { 33 | var testRun = request.TestRunId != null 34 | ? Db.SingleById(request.TestRunId.Value) 35 | : Db.Single(Db.From() 36 | .Where(x => x.TestPlanId == request.TestPlanId) 37 | .OrderByDescending(x => x.Id)); 38 | 39 | if (testRun == null) 40 | return new List(); 41 | 42 | var query = Db.From() 43 | .Where(q => q.TestPlanId == request.TestPlanId 44 | && q.TestRunId == testRun.Id); 45 | 46 | if (request.Host != null) 47 | query.Where(q => q.Hostname.Contains(request.Host)); 48 | if (request.Port != null) 49 | query.Where(q => q.Port == request.Port); 50 | if (request.RequestPath != null) 51 | query.Where(q => q.RequestPath.Contains(request.RequestPath)); 52 | 53 | var results = Db.Select(query.Limit(request.Skip, request.Take)); 54 | var total = Db.Count(query); 55 | 56 | var response = request.ConvertTo(); 57 | response.Total = (int)total; 58 | response.Results = results.ConvertAll(x => x.ToDisplayResult()); 59 | 60 | return response; 61 | } 62 | 63 | public object Any(ViewTestPlan request) 64 | { 65 | var testPlan = Db.Single(q => q.Slug == request.Slug); 66 | 67 | if (testPlan == null) 68 | throw HttpError.NotFound(request.Slug); 69 | 70 | var testRun = request.Id != null 71 | ? Db.Single(x => 72 | x.TestPlanId == testPlan.Id && x.Id == request.Id) 73 | : Db.Single(Db.From() 74 | .Where(x => x.TestPlanId == testPlan.Id) 75 | .OrderByDescending(x => x.Id)); 76 | 77 | var testResults = Db.Select(q => q.TestRunId == testRun.Id); 78 | 79 | return new ViewTestPlanResponse 80 | { 81 | TestPlan = testPlan, 82 | TestRun = testRun, 83 | Results = testResults.ConvertAll(x => x.ToDisplayResult()) 84 | }; 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceModel/BenchmarksAnalyzer.ServiceModel.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {F2EBE29F-4050-46E1-86AA-8FCFA6CD3860} 8 | Library 9 | Properties 10 | BenchmarksAnalyzer.ServiceModel 11 | BenchmarksAnalyzer.ServiceModel 12 | v4.7.2 13 | 512 14 | default 15 | 16 | 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | pdbonly 27 | true 28 | bin\Release\ 29 | TRACE 30 | prompt 31 | 4 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 71 | -------------------------------------------------------------------------------- /tests/Perf.Tests/Perf.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {141F69B6-7FE8-4989-8D23-7B04BD29D106} 8 | Library 9 | Properties 10 | Perf.Tests 11 | Perf.Tests 12 | v4.7.2 13 | 512 14 | default 15 | 16 | 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | pdbonly 27 | true 28 | bin\Release\ 29 | TRACE 30 | prompt 31 | 4 32 | 33 | 34 | 35 | ..\..\lib\ServiceStack.dll 36 | 37 | 38 | ..\..\lib\ServiceStack.Client.dll 39 | 40 | 41 | ..\..\lib\ServiceStack.Common.dll 42 | 43 | 44 | ..\..\lib\ServiceStack.Interfaces.dll 45 | 46 | 47 | ..\..\lib\ServiceStack.Text.dll 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | {F2EBE29F-4050-46E1-86AA-8FCFA6CD3860} 64 | BenchmarksAnalyzer.ServiceModel 65 | 66 | 67 | 68 | 69 | 70 | 71 | 78 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceInterface/BenchmarksAnalyzer.ServiceInterface.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {3849EE26-780B-450C-9183-0C6EFD2920D5} 8 | Library 9 | Properties 10 | BenchmarksAnalyzer.ServiceInterface 11 | BenchmarksAnalyzer.ServiceInterface 12 | v4.7.2 13 | 512 14 | default 15 | 16 | 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | pdbonly 27 | true 28 | bin\Release\ 29 | TRACE 30 | prompt 31 | 4 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | {F2EBE29F-4050-46E1-86AA-8FCFA6CD3860} 56 | BenchmarksAnalyzer.ServiceModel 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 76 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Global.asax.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using BenchmarksAnalyzer.ServiceInterface; 4 | using BenchmarksAnalyzer.ServiceModel.Types; 5 | using Funq; 6 | using ServiceStack; 7 | using ServiceStack.Api.OpenApi; 8 | using ServiceStack.Auth; 9 | using ServiceStack.Authentication.OAuth2; 10 | using ServiceStack.Caching; 11 | using ServiceStack.Configuration; 12 | using ServiceStack.Data; 13 | using ServiceStack.OrmLite; 14 | using ServiceStack.Razor; 15 | 16 | namespace BenchmarksAnalyzer 17 | { 18 | public class AppHost : AppHostBase 19 | { 20 | public AppHost() : base("HTTP Benchmarks Analyzer", typeof(WebServices).Assembly) { } 21 | 22 | public override void Configure(Container container) 23 | { 24 | Plugins.Add(new RazorFormat()); 25 | Plugins.Add(new RequestLogsFeature()); 26 | Plugins.Add(new PostmanFeature()); 27 | Plugins.Add(new OpenApiFeature()); 28 | 29 | Plugins.Add(new CorsFeature( 30 | allowOriginWhitelist: new[] { "http://localhost", "http://localhost:8080", "http://test.servicestack.net", "http://null.jsbin.com" }, 31 | allowCredentials: true, 32 | allowedHeaders: "Content-Type, Allow, Authorization")); 33 | 34 | //Load environment config from text file if exists 35 | var liveSettings = "~/appsettings.txt".MapHostAbsolutePath(); 36 | var appSettings = File.Exists(liveSettings) 37 | ? (IAppSettings)new TextFileSettings(liveSettings) 38 | : new AppSettings(); 39 | 40 | SetConfig(new HostConfig { 41 | DebugMode = appSettings.Get("DebugMode", false), 42 | StripApplicationVirtualPath = appSettings.Get("StripApplicationVirtualPath", false), 43 | AdminAuthSecret = appSettings.GetString("AuthSecret"), 44 | }); 45 | 46 | if (appSettings.GetString("DbProvider") == "PostgreSql") 47 | { 48 | container.Register(c => new OrmLiteConnectionFactory( 49 | appSettings.GetString("ConnectionString"), PostgreSqlDialect.Provider)); 50 | } 51 | else 52 | { 53 | container.Register(c => 54 | new OrmLiteConnectionFactory("~/db.sqlite".MapHostAbsolutePath(), SqliteDialect.Provider)); 55 | } 56 | 57 | container.RegisterAs(); 58 | container.Resolve().InitSchema(); 59 | 60 | Plugins.Add(new AuthFeature(() => new UserSession(), 61 | new IAuthProvider[] { 62 | new CredentialsAuthProvider(), 63 | new TwitterAuthProvider(appSettings), 64 | new FacebookAuthProvider(appSettings), 65 | new GoogleOAuth2Provider(appSettings), 66 | new LinkedInOAuth2Provider(appSettings), 67 | }) { 68 | HtmlRedirect = "~/", 69 | IncludeRegistrationService = true, 70 | MaxLoginAttempts = appSettings.Get("MaxLoginAttempts", 5), 71 | }); 72 | 73 | container.Register(c => 74 | new OrmLiteAuthRepository(c.Resolve())); 75 | 76 | container.Resolve().InitSchema(); 77 | 78 | using var db = container.Resolve().Open(); 79 | db.CreateTableIfNotExists(); 80 | db.CreateTableIfNotExists(); 81 | db.CreateTableIfNotExists(); 82 | } 83 | } 84 | 85 | public class Global : System.Web.HttpApplication 86 | { 87 | protected void Application_Start(object sender, EventArgs e) 88 | { 89 | log4net.Config.XmlConfigurator.Configure(); 90 | new AppHost().Init(); 91 | } 92 | } 93 | } -------------------------------------------------------------------------------- /servers/Techempower.ServiceInterface/ConfigApp.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading; 3 | using ServiceStack; 4 | using ServiceStack.Configuration; 5 | using ServiceStack.Data; 6 | using ServiceStack.OrmLite; 7 | using ServiceStack.Razor; 8 | using ServiceStack.Redis; 9 | 10 | namespace Techempower.ServiceInterface 11 | { 12 | public enum DbProvider 13 | { 14 | MySql, 15 | Sqlite, 16 | SqlServer, 17 | PostgreSql, 18 | InMemory, 19 | } 20 | 21 | public static class ConfigApp 22 | { 23 | public static void AppHost(ServiceStackHost appHost, DbProvider defaultDb = DbProvider.SqlServer) 24 | { 25 | appHost.Plugins.Add(new RazorFormat()); 26 | 27 | appHost.Container.Register(CreateDbFactory(defaultDb)); 28 | //appHost.Container.Register(c => new PooledRedisClientManager()); 29 | } 30 | 31 | public static OrmLiteConnectionFactory CreateDbFactory(DbProvider defaultDb) 32 | { 33 | var appSettings = new AppSettings(); 34 | var dbProvider = appSettings.Get("connection", defaultValue: defaultDb); 35 | switch (dbProvider) 36 | { 37 | case DbProvider.InMemory: 38 | return new OrmLiteConnectionFactory(":memory:", 39 | SqliteDialect.Provider); 40 | 41 | case DbProvider.SqlServer: 42 | return new OrmLiteConnectionFactory( 43 | appSettings.Get("connection.sqlserver", "Server=localhost;Database=test;User Id=test;Password=test;"), 44 | SqlServerDialect.Provider); 45 | 46 | case DbProvider.PostgreSql: 47 | return new OrmLiteConnectionFactory( 48 | appSettings.Get("connection.postgresql", "Server=localhost;Port=5432;User Id=test;Password=test;Database=test;Pooling=true;MinPoolSize=0;MaxPoolSize=200"), 49 | PostgreSqlDialect.Provider); 50 | 51 | case DbProvider.MySql: 52 | return new OrmLiteConnectionFactory( 53 | appSettings.Get("connection.mysql", "Server=localhost;Database=test;UID=root;Password=test"), 54 | MySqlDialect.Provider); 55 | 56 | case DbProvider.Sqlite: 57 | return new OrmLiteConnectionFactory( 58 | appSettings.Get("connection.sqlite", "db.sqlite"), 59 | SqliteDialect.Provider); 60 | 61 | default: 62 | throw new NotImplementedException(dbProvider.ToString()); 63 | } 64 | } 65 | 66 | public static void MinWorkerThreads(int defaultValue=8) 67 | { 68 | // To improve CPU utilization, increase the number of threads that the .NET thread pool expands by when 69 | // a burst of requests come in. We could do this by editing machine.config/system.web/processModel/minWorkerThreads, 70 | // but that seems too global a change, so we do it in code for just our AppPool. More info: 71 | // 72 | // http://support.microsoft.com/kb/821268 73 | // http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx 74 | // http://blogs.msdn.com/b/perfworld/archive/2010/01/13/how-can-i-improve-the-performance-of-asp-net-by-adjusting-the-clr-thread-throttling-properties.aspx 75 | 76 | var appSettings = new AppSettings(); 77 | int newMinWorkerThreads = appSettings.Get("minWorkerThreadsPerLogicalProcessor", defaultValue); 78 | if (newMinWorkerThreads > 0) 79 | { 80 | int minWorkerThreads, minCompletionPortThreads; 81 | ThreadPool.GetMinThreads(out minWorkerThreads, out minCompletionPortThreads); 82 | ThreadPool.SetMinThreads(Environment.ProcessorCount * newMinWorkerThreads, minCompletionPortThreads); 83 | } 84 | } 85 | } 86 | } -------------------------------------------------------------------------------- /servers/Techempower.ServiceInterface/Techempower.ServiceInterface.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {F9340D2F-DA53-47CA-925C-B67992E4D667} 8 | Library 9 | Properties 10 | Techempower.ServiceInterface 11 | Techempower.ServiceInterface 12 | v4.7.2 13 | 512 14 | default 15 | 16 | 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | pdbonly 27 | true 28 | bin\Release\ 29 | TRACE 30 | prompt 31 | 4 32 | 33 | 34 | 35 | ..\..\lib\ServiceStack.dll 36 | 37 | 38 | ..\..\lib\ServiceStack.Common.dll 39 | 40 | 41 | ..\..\lib\ServiceStack.Interfaces.dll 42 | 43 | 44 | ..\..\lib\ServiceStack.OrmLite.dll 45 | 46 | 47 | ..\..\lib\ServiceStack.OrmLite.MySql.dll 48 | 49 | 50 | ..\..\lib\ServiceStack.OrmLite.PostgreSQL.dll 51 | 52 | 53 | ..\..\lib\ServiceStack.OrmLite.Sqlite.dll 54 | 55 | 56 | ..\..\lib\ServiceStack.OrmLite.SqlServer.dll 57 | 58 | 59 | ..\..\lib\ServiceStack.Razor.dll 60 | 61 | 62 | ..\..\lib\ServiceStack.Redis.dll 63 | 64 | 65 | ..\..\lib\ServiceStack.Text.dll 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 88 | -------------------------------------------------------------------------------- /servers/Perf.ServiceInterface/Perf.ServiceInterface.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {E1EFD00E-8A97-41AF-BE99-78A5F3FE5932} 8 | Library 9 | Properties 10 | Perf.SeviceInterface 11 | Perf.SeviceInterface 12 | v4.7.2 13 | 512 14 | 15 | default 16 | 17 | 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | false 26 | 27 | 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | false 35 | 36 | 37 | 38 | ..\..\lib\MySql.Data.dll 39 | 40 | 41 | ..\..\lib\Npgsql.dll 42 | 43 | 44 | ..\..\lib\ServiceStack.dll 45 | 46 | 47 | ..\..\lib\ServiceStack.Client.dll 48 | 49 | 50 | ..\..\lib\ServiceStack.Common.dll 51 | 52 | 53 | ..\..\lib\ServiceStack.Interfaces.dll 54 | 55 | 56 | ..\..\lib\ServiceStack.OrmLite.dll 57 | 58 | 59 | ..\..\lib\ServiceStack.OrmLite.MySql.dll 60 | 61 | 62 | ..\..\lib\ServiceStack.OrmLite.PostgreSQL.dll 63 | 64 | 65 | ..\..\lib\ServiceStack.OrmLite.SqlServer.dll 66 | 67 | 68 | ..\..\lib\ServiceStack.Razor.dll 69 | 70 | 71 | ..\..\lib\ServiceStack.Server.dll 72 | 73 | 74 | ..\..\lib\ServiceStack.Text.dll 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 97 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer.ServiceInterface/ApacheBenchmarkUtils.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Text; 3 | using BenchmarksAnalyzer.ServiceModel.Types; 4 | using ServiceStack; 5 | 6 | namespace BenchmarksAnalyzer.ServiceInterface 7 | { 8 | public static class ApacheBenchmarkUtils 9 | { 10 | public static TestResult ToTestResult(this FileInfo file) 11 | { 12 | using (var stream = file.OpenRead()) 13 | { 14 | return ToTestResult(stream); 15 | } 16 | } 17 | 18 | public static TestResult ToTestResult(this string fileContents) 19 | { 20 | using (var stream = new MemoryStream(fileContents.ToUtf8Bytes())) 21 | { 22 | return ToTestResult(stream); 23 | } 24 | } 25 | 26 | public static TestResult ToTestResult(this Stream stream) 27 | { 28 | var to = new TestResult(); 29 | bool reachedStats = false; 30 | var sb = new StringBuilder(); 31 | 32 | foreach (var line in stream.ReadLines()) 33 | { 34 | sb.AppendLine(line); 35 | 36 | if (!ParseLine(line, to, ref reachedStats)) 37 | break; 38 | } 39 | 40 | to.RawData = sb.ToString(); 41 | 42 | return to; 43 | } 44 | 45 | private static bool ParseLine(string line, TestResult to, ref bool reachedStats) 46 | { 47 | if (line.Trim().Length == 0) 48 | return true; 49 | 50 | var startOfStats = line.StartsWith("Server Software:"); 51 | if (!reachedStats && !startOfStats) 52 | return true; 53 | 54 | if (startOfStats) 55 | reachedStats = true; 56 | 57 | if (line.StartsWith("Connection Times (ms)")) 58 | return true; 59 | 60 | var parts = line.SplitOnFirst(':'); 61 | if (parts.Length == 2) 62 | { 63 | var key = parts[0].Trim(); 64 | var value = parts[1].Trim(); 65 | 66 | switch (key) 67 | { 68 | case "Server Software": 69 | to.Software = value; 70 | break; 71 | case "Server Hostname": 72 | to.Hostname = value; 73 | break; 74 | case "Server Port": 75 | to.Port = value.ToInt(); 76 | break; 77 | case "Document Path": 78 | to.RequestPath = value; 79 | break; 80 | case "Document Length": 81 | to.RequestLength = value.SplitOnFirst(' ')[0].ToInt(); 82 | break; 83 | case "Concurrency Level": 84 | to.Concurrency = value.ToInt(); 85 | break; 86 | case "Time taken for tests": 87 | to.TimeTaken = double.Parse(value.SplitOnFirst(' ')[0]); 88 | break; 89 | case "Complete requests": 90 | to.TotalRequests = value.ToInt(); 91 | break; 92 | case "Failed requests": 93 | to.FailedRequests = value.ToInt(); 94 | break; 95 | case "Total transferred": 96 | to.TotalTransferred = value.SplitOnFirst(' ')[0].ToInt(); 97 | break; 98 | case "HTML transferred": 99 | to.HtmlTransferred = value.SplitOnFirst(' ')[0].ToInt(); 100 | break; 101 | case "Requests per second": 102 | to.RequestsPerSec = double.Parse(value.SplitOnFirst(' ')[0]); 103 | break; 104 | case "Time per request": 105 | to.TimePerRequest = double.Parse(value.SplitOnFirst(' ')[0]); //gets overwritten with avg per concurrent request, i.e. what we want 106 | break; 107 | case "Transfer rate": 108 | to.TransferRate = double.Parse(value.SplitOnFirst(' ')[0]); 109 | break; 110 | } 111 | 112 | return true; 113 | } 114 | 115 | if (line.Trim().StartsWith("(Connect:")) 116 | { 117 | to.FailedReasons = line.Trim(); 118 | return true; 119 | } 120 | 121 | return false; 122 | } 123 | } 124 | } -------------------------------------------------------------------------------- /lib/ServiceStack.Razor.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ServiceStack.Razor 5 | 6 | 7 | 8 | 9 | Provides service methods for compilation. 10 | 11 | 12 | 13 | 14 | Determines if the specified type is an anonymous type. 15 | 16 | The type to check. 17 | True if the type is an anonymous type, otherwise false. 18 | 19 | 20 | 21 | Determines if the specified type is a dynamic type. 22 | 23 | The type to check. 24 | True if the type is an anonymous type, otherwise false. 25 | 26 | 27 | 28 | Gets the public or protected constructors of the specified type. 29 | 30 | The target type. 31 | An enumerable of constructors. 32 | 33 | 34 | 35 | Gets an enumerable of all assemblies loaded in the current domain. 36 | 37 | An enumerable of loaded assemblies. 38 | 39 | 40 | 41 | The purpose of the FileSystemWatcher is to ensure razor pages are 42 | consistent with the code generated by the razor engine. The file 43 | system watcher will invalidate pages and queue them for recompilation. 44 | 45 | 46 | 47 | 48 | Avoid throwing unhandled exception when shutting down ASP.NET host 49 | 50 | 51 | 52 | 53 | Attempts to locate the nearest global directive file by 54 | 55 | 56 | 57 | 58 | Gets or sets the root namespace used when the full namespace is inferred from the VirtualPath. 59 | 60 | 61 | 62 | 63 | A common hook into ServiceStack and the hosting infrastructure used to resolve requests. 64 | 65 | 66 | 67 | 68 | This is called by the hosting environment via CatchAll usually for content pages. 69 | 70 | 71 | 72 | 73 | Called by the HtmlFormat:IPlugin who checks to see if any registered view engines can handle the response DTO. 74 | If this view engine can handle the response DTO, then process it, otherwise, returning false will 75 | allow another view engine to attempt to process it. If no view engines can process the DTO, 76 | HtmlFormat will simply handle it itself. 77 | 78 | 79 | 80 | 81 | This view manager is responsible for keeping track of all the 82 | available Razor views and states of Razor pages. 83 | 84 | 85 | 86 | 87 | Class to represent attribute values and, more importantly, 88 | decipher them from tuple madness slightly. 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /servers/Techempower.ServiceInterface/TechmeServices.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading; 4 | using ServiceStack; 5 | using ServiceStack.DataAnnotations; 6 | using ServiceStack.OrmLite; 7 | using ServiceStack.Redis; 8 | 9 | namespace Techempower.ServiceInterface 10 | { 11 | [Route("/json")] 12 | public class Hello 13 | { 14 | public string name { get; set; } 15 | } 16 | 17 | public class HelloResponse 18 | { 19 | public string message { get; set; } 20 | } 21 | 22 | [Route("/db")] 23 | public class Db { } 24 | 25 | [Route("/redis")] 26 | public class Redis { } 27 | 28 | [Route("/queries")] 29 | public class Queries 30 | { 31 | public int queries { get; set; } 32 | } 33 | 34 | [Route("/fortunes")] 35 | public class Fortunes { } 36 | 37 | [Route("/updates")] 38 | public class Updates 39 | { 40 | public int queries { get; set; } 41 | } 42 | 43 | [Route("/plaintext")] 44 | public class PlainText { } 45 | 46 | public class World 47 | { 48 | public int id { get; set; } 49 | public int randomNumber { get; set; } 50 | } 51 | 52 | public class Fortune : IComparable 53 | { 54 | [AutoIncrement] 55 | public int id { get; set; } 56 | public string message { get; set; } 57 | 58 | public int CompareTo(Fortune other) 59 | { 60 | return message.CompareTo(other.message); 61 | } 62 | } 63 | 64 | public class TechmeServices : Service 65 | { 66 | readonly Random rand = new Random(); 67 | 68 | public object Any(Hello request) 69 | { 70 | return new HelloResponse { message = "Hello, " + (request.name ?? "World") + "!" }; 71 | } 72 | 73 | public object Any(Db request) 74 | { 75 | return Db.SingleById(rand.Next(0, 10000) + 1); 76 | } 77 | 78 | public object Any(Redis request) 79 | { 80 | return Redis.GetById(rand.Next(0, 10000) + 1); 81 | } 82 | 83 | public object Any(Queries request) 84 | { 85 | var queries = Math.Max(1, Math.Min(500, request.queries)); 86 | var worlds = new World[queries]; 87 | 88 | for (int i = 0; i < queries; i++) 89 | { 90 | worlds[i] = Db.SingleById(rand.Next(0, 10000) + 1); 91 | } 92 | return worlds; 93 | } 94 | 95 | public List Any(Fortunes request) 96 | { 97 | var fortunes = new List(); 98 | 99 | fortunes.AddRange(Db.Select()); 100 | fortunes.Add(new Fortune { id = 0, message = "Additional fortune added at request time." }); 101 | fortunes.Sort(); 102 | 103 | return fortunes; 104 | } 105 | 106 | public void Any(Updates request) 107 | { 108 | var queries = Math.Max(1, Math.Min(500, request.queries)); 109 | var worlds = new World[queries]; 110 | 111 | for (int i = 0; i < queries; i++) 112 | { 113 | worlds[i] = Db.SingleById(rand.Next(0, 10000) + 1); 114 | worlds[i].randomNumber = rand.Next(0, 10000) + 1; 115 | } 116 | 117 | Db.UpdateAll(worlds); 118 | } 119 | 120 | [AddHeader(ContentType = MimeTypes.PlainText)] 121 | public string Any(PlainText request) 122 | { 123 | return "Hello, World"; 124 | } 125 | 126 | public void Any(Reset request) 127 | { 128 | var fullReset = request.Level == null || request.Level == "full"; 129 | 130 | if (fullReset || request.Level == "db") 131 | { 132 | Db.DropAndCreateTable(); 133 | 134 | var worlds = 10000.Times(i => new World { id = i, randomNumber = rand.Next(0, 10000) + 1 }); 135 | Db.InsertAll(worlds); 136 | 137 | if (TryResolve() != null) 138 | { 139 | Redis.FlushAll(); 140 | Redis.StoreAll(worlds); 141 | } 142 | 143 | Db.DropAndCreateTable(); 144 | new[] { 145 | "A budget is just a method of worrying before you spend money, as well as afterward.", 146 | "A classic is something that everybody wants to have read and nobody wants to read.", 147 | "A conclusion is simply the place where someone got tired of thinking.", 148 | "A diplomat is someone who can tell you to go to hell in such a way that you will look forward to the trip.", 149 | "A psychiatrist is a person who will give you expensive answers that your wife will give you for free.", 150 | }.Each(x => Db.Insert(new Fortune { message = x })); 151 | } 152 | 153 | if (fullReset || request.Level == "gc") 154 | { 155 | GC.Collect(); 156 | } 157 | 158 | if (fullReset || request.Level == "pause") 159 | { 160 | Thread.Sleep(2000); 161 | } 162 | } 163 | } 164 | 165 | [Route("/reset")] 166 | [Route("/reset/{Level}")] 167 | public class Reset 168 | { 169 | public string Level { get; set; } 170 | } 171 | } -------------------------------------------------------------------------------- /servers/Techempower.HttpListener/Techempower.HttpListener.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {CE4A8244-A56E-4882-9671-4CA41926F6DA} 8 | Exe 9 | Properties 10 | Techempower.HttpListener 11 | Techempower.HttpListener 12 | v4.7.2 13 | 512 14 | default 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | ..\..\lib\MySql.Data.dll 38 | 39 | 40 | ..\..\lib\Npgsql.dll 41 | 42 | 43 | ..\..\lib\ServiceStack.dll 44 | 45 | 46 | ..\..\lib\ServiceStack.Client.dll 47 | 48 | 49 | ..\..\lib\ServiceStack.Common.dll 50 | 51 | 52 | ..\..\lib\ServiceStack.Interfaces.dll 53 | 54 | 55 | ..\..\lib\ServiceStack.OrmLite.dll 56 | 57 | 58 | ..\..\lib\ServiceStack.OrmLite.MySql.dll 59 | 60 | 61 | ..\..\lib\ServiceStack.OrmLite.PostgreSQL.dll 62 | 63 | 64 | ..\..\lib\ServiceStack.OrmLite.SqlServer.dll 65 | 66 | 67 | ..\..\lib\ServiceStack.Razor.dll 68 | 69 | 70 | ..\..\lib\ServiceStack.Server.dll 71 | 72 | 73 | ..\..\lib\ServiceStack.Text.dll 74 | 75 | 76 | 77 | 78 | False 79 | ..\..\lib\System.Web.Razor.dll 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | PreserveNewest 95 | 96 | 97 | 98 | Web.config 99 | 100 | 101 | Web.config 102 | 103 | 104 | 105 | 106 | {F9340D2F-DA53-47CA-925C-B67992E4D667} 107 | Techempower.ServiceInterface 108 | 109 | 110 | 111 | 118 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.Pool/Techempower.HttpListener.Pool.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {B971976A-3E05-4484-BB7F-09AC8A548D48} 8 | Exe 9 | Properties 10 | Techempower.HttpListener.Pool 11 | Techempower.HttpListener.Pool 12 | v4.7.2 13 | 512 14 | default 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | ..\..\lib\MySql.Data.dll 38 | 39 | 40 | ..\..\lib\Npgsql.dll 41 | 42 | 43 | ..\..\lib\ServiceStack.dll 44 | 45 | 46 | ..\..\lib\ServiceStack.Api.Swagger.dll 47 | 48 | 49 | ..\..\lib\ServiceStack.Client.dll 50 | 51 | 52 | ..\..\lib\ServiceStack.Common.dll 53 | 54 | 55 | ..\..\lib\ServiceStack.Interfaces.dll 56 | 57 | 58 | ..\..\lib\ServiceStack.OrmLite.dll 59 | 60 | 61 | ..\..\lib\ServiceStack.OrmLite.MySql.dll 62 | 63 | 64 | ..\..\lib\ServiceStack.OrmLite.PostgreSQL.dll 65 | 66 | 67 | ..\..\lib\ServiceStack.OrmLite.SqlServer.dll 68 | 69 | 70 | ..\..\lib\ServiceStack.Razor.dll 71 | 72 | 73 | ..\..\lib\ServiceStack.Server.dll 74 | 75 | 76 | ..\..\lib\ServiceStack.Text.dll 77 | 78 | 79 | 80 | 81 | False 82 | ..\..\lib\System.Web.Razor.dll 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | PreserveNewest 98 | 99 | 100 | 101 | Web.config 102 | 103 | 104 | Web.config 105 | 106 | 107 | 108 | 109 | {F9340D2F-DA53-47CA-925C-B67992E4D667} 110 | Techempower.ServiceInterface 111 | 112 | 113 | 114 | 121 | -------------------------------------------------------------------------------- /servers/Techempower.SelfHost/Techempower.SelfHost.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {04B8785B-2EDC-436F-9031-11A30B48ABD5} 8 | Exe 9 | Properties 10 | Techempower.SelfHost 11 | Techempower.SelfHost 12 | v4.7.2 13 | 512 14 | default 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | x86 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | ..\..\lib\ServiceStack.dll 38 | 39 | 40 | ..\..\lib\ServiceStack.Client.dll 41 | 42 | 43 | ..\..\lib\ServiceStack.Common.dll 44 | 45 | 46 | ..\..\lib\ServiceStack.Interfaces.dll 47 | 48 | 49 | ..\..\lib\ServiceStack.OrmLite.dll 50 | 51 | 52 | ..\..\lib\ServiceStack.OrmLite.MySql.dll 53 | 54 | 55 | ..\..\lib\ServiceStack.OrmLite.PostgreSQL.dll 56 | 57 | 58 | ..\..\lib\ServiceStack.OrmLite.Sqlite.dll 59 | 60 | 61 | ..\..\lib\ServiceStack.OrmLite.SqlServer.dll 62 | 63 | 64 | ..\..\lib\ServiceStack.Razor.dll 65 | 66 | 67 | ..\..\lib\ServiceStack.Redis.dll 68 | 69 | 70 | ..\..\lib\ServiceStack.Server.dll 71 | 72 | 73 | ..\..\lib\ServiceStack.Text.dll 74 | 75 | 76 | 77 | 78 | False 79 | ..\..\lib\System.Web.Razor.dll 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | PreserveNewest 95 | 96 | 97 | 98 | Web.config 99 | 100 | 101 | Web.config 102 | 103 | 104 | 105 | 106 | {F9340D2F-DA53-47CA-925C-B67992E4D667} 107 | Techempower.ServiceInterface 108 | 109 | 110 | 111 | 112 | sqlite3.dll 113 | PreserveNewest 114 | 115 | 116 | 117 | 124 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Scripts/fineuploader-3.2.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Original version: 1.0 © 2010 Andrew Valums ( andrew(at)valums.com ) 3 | * Current Maintainer (2.0+): 2012, Ray Nicholus ( fineuploader(at)garstasio.com ) 4 | * 5 | * Licensed under MIT license, GNU GPL 2 or later, GNU LGPL 2 or later, see license.txt. 6 | */ 7 | .qq-uploader { 8 | position: relative; 9 | width: 100%; 10 | } 11 | .qq-upload-button { 12 | display: block; 13 | width: 105px; 14 | padding: 7px 0; 15 | text-align: center; 16 | background: #880000; 17 | border-bottom: 1px solid #DDD; 18 | color: #FFF; 19 | } 20 | .qq-upload-button-hover { 21 | background: #CC0000; 22 | } 23 | .qq-upload-button-focus { 24 | outline: 1px dotted #000000; 25 | } 26 | .qq-upload-drop-area, .qq-upload-extra-drop-area { 27 | position: absolute; 28 | top: 0; 29 | left: 0; 30 | width: 100%; 31 | height: 100%; 32 | min-height: 30px; 33 | z-index: 2; 34 | background: #FF9797; 35 | text-align: center; 36 | } 37 | .qq-upload-drop-area span { 38 | display: block; 39 | position: absolute; 40 | top: 50%; 41 | width: 100%; 42 | margin-top: -8px; 43 | font-size: 16px; 44 | } 45 | .qq-upload-extra-drop-area { 46 | position: relative; 47 | margin-top: 50px; 48 | font-size: 16px; 49 | padding-top: 30px; 50 | height: 20px; 51 | min-height: 40px; 52 | } 53 | .qq-upload-drop-area-active { 54 | background: #FF7171; 55 | } 56 | .qq-upload-list { 57 | margin: 0; 58 | padding: 0; 59 | list-style: none; 60 | } 61 | .qq-upload-list li { 62 | margin: 0; 63 | padding: 9px; 64 | line-height: 15px; 65 | font-size: 16px; 66 | background-color: #FFF0BD; 67 | } 68 | .qq-upload-file, .qq-upload-spinner, .qq-upload-size, .qq-upload-cancel, .qq-upload-retry, .qq-upload-failed-text, .qq-upload-finished { 69 | margin-right: 12px; 70 | } 71 | .qq-upload-file { 72 | } 73 | .qq-upload-spinner { 74 | display: inline-block; 75 | background: url("loading.gif"); 76 | width: 15px; 77 | height: 15px; 78 | vertical-align: text-bottom; 79 | } 80 | .qq-drop-processing { 81 | display: none; 82 | } 83 | .qq-drop-processing-spinner { 84 | display: inline-block; 85 | background: url("processing.gif"); 86 | width: 24px; 87 | height: 24px; 88 | vertical-align: text-bottom; 89 | } 90 | .qq-upload-finished { 91 | display:none; 92 | width:15px; 93 | height:15px; 94 | vertical-align:text-bottom; 95 | } 96 | .qq-upload-retry { 97 | display: none; 98 | color: #000000; 99 | } 100 | .qq-upload-cancel { 101 | color: #000000; 102 | } 103 | .qq-upload-retryable .qq-upload-retry { 104 | display: inline; 105 | } 106 | .qq-upload-size, .qq-upload-cancel, .qq-upload-retry { 107 | font-size: 12px; 108 | font-weight: normal; 109 | } 110 | .qq-upload-failed-text { 111 | display: none; 112 | font-style: italic; 113 | font-weight: bold; 114 | } 115 | .qq-upload-failed-icon { 116 | display:none; 117 | width:15px; 118 | height:15px; 119 | vertical-align:text-bottom; 120 | } 121 | .qq-upload-fail .qq-upload-failed-text { 122 | display: inline; 123 | } 124 | .qq-upload-retrying .qq-upload-failed-text { 125 | display: inline; 126 | color: #D60000; 127 | } 128 | .qq-upload-list li.qq-upload-success { 129 | background-color: #5DA30C; 130 | color: #FFFFFF; 131 | } 132 | .qq-upload-list li.qq-upload-fail { 133 | background-color: #D60000; 134 | color: #FFFFFF; 135 | } 136 | .qq-progress-bar { 137 | background: -moz-linear-gradient(top, rgba(30,87,153,1) 0%, rgba(41,137,216,1) 50%, rgba(32,124,202,1) 51%, rgba(125,185,232,1) 100%); /* FF3.6+ */ 138 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(30,87,153,1)), color-stop(50%,rgba(41,137,216,1)), color-stop(51%,rgba(32,124,202,1)), color-stop(100%,rgba(125,185,232,1))); /* Chrome,Safari4+ */ 139 | background: -webkit-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Chrome10+,Safari5.1+ */ 140 | background: -o-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Opera 11.10+ */ 141 | background: -ms-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* IE10+ */ 142 | background: linear-gradient(to bottom, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* W3C */ 143 | width: 0%; 144 | height: 15px; 145 | border-radius: 6px; 146 | margin-bottom: 3px; 147 | display: none; 148 | } 149 | 150 | /* Custom Bootstrap css*/ 151 | .qq-upload-button { 152 | color: #333; 153 | text-align: center; 154 | white-space: nowrap; 155 | vertical-align: middle; 156 | cursor: pointer; 157 | background-color: #fff; 158 | border-color: #ccc; 159 | 160 | padding: 10px 16px; 161 | font-size: 18px; 162 | line-height: 1.33; 163 | border-radius: 6px; 164 | 165 | width: 200px; 166 | 167 | text-shadow: 0 1px 0 #fff; 168 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 169 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 170 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 171 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 172 | background-repeat: repeat-x; 173 | 174 | border: 1px solid transparent; 175 | border-color: #ccc; 176 | margin: 0 0 10px 0; 177 | } 178 | .qq-upload-button:hover, 179 | .qq-upload-button:focus { 180 | background-color: #e0e0e0; 181 | background-position: 0 -15px; 182 | } 183 | .qq-upload-button:active, 184 | .qq-upload-button.active { 185 | background-color: #e0e0e0; 186 | border-color: #dbdbdb; 187 | } 188 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Views/Shared/AutoGrid.cshtml: -------------------------------------------------------------------------------- 1 | @inherits ViewPage 2 | 3 | 37 | 38 |
39 | 40 | 41 | 42 | 154 | -------------------------------------------------------------------------------- /src/BenchmarksAnalyzer/Views/ViewTestPlan.cshtml: -------------------------------------------------------------------------------- 1 | @inherits ViewPage 2 | 3 | @{ 4 | ViewBag.Title = Model.TestRun.SeriesId + " - " + Model.TestPlan.Name; 5 | } 6 | 7 | 23 | 24 | view details 25 | 26 |

@Model.TestPlan.Name - @Model.TestRun.SeriesId

27 | 28 |
29 | 30 |
31 | 32 | 33 | 34 | 184 | 185 | 186 | -------------------------------------------------------------------------------- /servers/Techempower.HttpListener.SmartPool/Techempower.HttpListener.SmartPool.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {AB040F8D-2886-4513-8301-8FA78AECD358} 8 | Exe 9 | Properties 10 | Techempower.HttpListener.SmartPool 11 | Techempower.HttpListener.SmartPool 12 | v4.7.2 13 | 512 14 | default 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | ..\..\lib\Mono.Data.Sqlite.dll 38 | 39 | 40 | False 41 | ..\..\lib\Mono.Security.dll 42 | 43 | 44 | ..\..\lib\MySql.Data.dll 45 | 46 | 47 | ..\..\lib\Npgsql.dll 48 | 49 | 50 | ..\..\lib\ServiceStack.dll 51 | 52 | 53 | ..\..\lib\ServiceStack.Api.Swagger.dll 54 | 55 | 56 | ..\..\lib\ServiceStack.Client.dll 57 | 58 | 59 | ..\..\lib\ServiceStack.Common.dll 60 | 61 | 62 | ..\..\lib\ServiceStack.Interfaces.dll 63 | 64 | 65 | ..\..\lib\ServiceStack.OrmLite.dll 66 | 67 | 68 | ..\..\lib\ServiceStack.OrmLite.MySql.dll 69 | 70 | 71 | ..\..\lib\ServiceStack.OrmLite.PostgreSQL.dll 72 | 73 | 74 | ..\..\lib\ServiceStack.OrmLite.Sqlite.dll 75 | 76 | 77 | ..\..\lib\ServiceStack.OrmLite.SqlServer.dll 78 | 79 | 80 | ..\..\lib\ServiceStack.Razor.dll 81 | 82 | 83 | ..\..\lib\ServiceStack.Server.dll 84 | 85 | 86 | ..\..\lib\ServiceStack.Text.dll 87 | 88 | 89 | 90 | 91 | False 92 | ..\..\lib\System.Web.Razor.dll 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | PreserveNewest 108 | 109 | 110 | 111 | Web.config 112 | 113 | 114 | Web.config 115 | 116 | 117 | 118 | 119 | {F9340D2F-DA53-47CA-925C-B67992E4D667} 120 | Techempower.ServiceInterface 121 | 122 | 123 | 124 | 125 | sqlite3.dll 126 | PreserveNewest 127 | 128 | 129 | 130 | 137 | --------------------------------------------------------------------------------