public BenchmarkResultSet(string benchmark, BenchmarkParameters parameters)
		{
			this.Benchmark = benchmark;
			this.parameters = parameters;

			results = new BenchmarkResult[parameters.NumberOfThreads];
		}
		private void Report(BenchmarkResultSet result, BenchmarkParameters parameters)
		{
			Output("Report for benchmark:		{0}", result.Benchmark);
			Output("Bytes:				{0:#,#;;0} kb", result.TotalBytes / 1024);
			Output("Time (seconds):			{0:00}", result.ElapsedSeconds);
			Output("Rate:				{0}", result.Rate);
			Output("Operations:			{0:#,#;;0}", result.TotalOperations);
			Output("Operations per second:		{0:#,#;;0} op/s", result.TotalOperations / result.ElapsedSeconds);
			Output("Milliseconds per op:		{0:0.00000} ms/op", result.ElapsedMilliseconds / (double)result.TotalOperations);

			if (parameters.Histogram)
			{
				Output(result.Histogram.ToString());
			}

			if (result.Messages.Count > 0)
			{
				Output("Messages:");
				for (var index = 0; index < result.Messages.Count; index++)
				{
					var message = result.Messages[index];
					Output(string.Format("{0}. {1}", index + 1, message));
				}
			}

			Output(Constants.Separator);
		}
		public BenchmarkResult(BenchmarkParameters parameters)
		{
			this.parameters = parameters;
			lastOperationFinishedDate = DateTime.Now;

			messages = new List<string>();
			Histogram = new Histogram();

			Stopwatch = new Stopwatch();
			StartTimer();
		}
		private Task<BenchmarkResult> DoWrite(BenchmarkParameters parameters, bool seq)
		{
			var random = new Random();
			var generator = new RandomGenerator();

			var result = new BenchmarkResult(parameters);

			var tasks = new List<Task>(parameters.Num);

			long bytes = 0;
			for (var i = 0; i < parameters.Num; i += parameters.EntriesPerBatch)
			{
				var batch = new WriteBatch();
				for (var j = 0; j < parameters.EntriesPerBatch; j++)
				{
					var k = seq ? i + j : random.Next() % options.Num;
					var key = string.Format("{0:0000000000000000}", k);
					batch.Put(key, generator.Generate(parameters.ValueSize));
					bytes += parameters.ValueSize + key.Length;
					result.FinishOperation();
				}

				tasks.Add(storage.Writer.WriteAsync(batch, new WriteOptions
															   {
																   FlushToDisk = parameters.Sync
															   }));
			}

			result.AddBytes(bytes);

			return Task.WhenAll(tasks).ContinueWith(t => result);
		}
		private Task<BenchmarkResult> WriteSeq(BenchmarkParameters parameters)
		{
			return DoWrite(parameters, true);
		}
		private Task<BenchmarkResult> WriteRandom(BenchmarkParameters parameters)
		{
			return DoWrite(parameters, false);
		}
		private Task<BenchmarkResult> ReadSequential(BenchmarkParameters parameters)
		{
			var result = new BenchmarkResult(parameters);
			using (var iterator = storage.Reader.NewIterator(new ReadOptions()))
			{
				var i = 0;
				long bytes = 0;
				for (iterator.SeekToFirst(); i < parameters.Reads && iterator.IsValid; iterator.Next())
				{
					using (var valueStream = iterator.CreateValueStream())
					{
						bytes += iterator.Key.Count + valueStream.Length;
					}
					result.FinishOperation();
					++i;
				}

				result.AddBytes(bytes);
				return Task.FromResult(result);
			}
		}
		private Task<BenchmarkResult> ReadRandom(BenchmarkParameters parameters)
		{
			var random = new Random();
			var found = 0;

			var result = new BenchmarkResult(parameters);

			for (int i = 0; i < parameters.Reads; i++)
			{
				var k = random.Next() % options.Num;
				var key = string.Format("{0:0000000000000000}", k);

				using (var streamValue = storage.Reader.Read(key))
				{
					if (streamValue != null)
						found++;
				}

				result.FinishOperation();
			}

			result.AddMessage(string.Format("({0} of {1} found)", found, parameters.Num));

			return Task.FromResult(result);
		}
		private Task<BenchmarkResult> ReadMissing(BenchmarkParameters parameters)
		{
			var random = new Random();
			var result = new BenchmarkResult(parameters);

			for (int i = 0; i < parameters.Reads; i++)
			{
				var k = random.Next() % options.Num;
				var key = string.Format("{0:0000000000000000}", k);

				using (storage.Reader.Read(key)) { }

				result.FinishOperation();
			}

			return Task.FromResult(result);
		}
示例#10
0
		private Task<BenchmarkResult> DoDelete(BenchmarkParameters parameters, bool seq)
		{
			var random = new Random();
			var result = new BenchmarkResult(parameters);

			var tasks = new List<Task>(parameters.Num);

			for (var i = 0; i < parameters.Num; i += parameters.EntriesPerBatch)
			{
				var batch = new WriteBatch();
				for (var j = 0; j < parameters.EntriesPerBatch; j++)
				{
					var k = seq ? i + j : random.Next() % options.Num;
					var key = string.Format("{0:0000000000000000}", k);
					batch.Delete(key);
					result.FinishOperation();
				}

				tasks.Add(storage.Writer.WriteAsync(batch));
			}

			return Task.WhenAll(tasks).ContinueWith(t => result);
		}
示例#11
0
		private Task<BenchmarkResult> ReadWhileWriting(BenchmarkParameters parameters)
		{
			var random = new Random();
			var generator = new RandomGenerator();

			var readTask = ReadRandom(parameters);
			Task.Factory.StartNew(async () =>
				{
					while (readTask.IsCompleted == false)
					{
						var batch = new WriteBatch();

						var k = random.Next() % options.Num;
						var key = string.Format("{0:0000000000000000}", k);

						batch.Put(key, generator.Generate(parameters.ValueSize));
						await storage.Writer.WriteAsync(batch);
					}
				});

			return readTask;
		}
示例#12
0
		private async Task<BenchmarkResult> Compact(BenchmarkParameters parameters)
		{
			var result = new BenchmarkResult(parameters);
			await storage.Commands.CompactRangeAsync(null, null);

			return result;
		}
示例#13
0
		private Task<BenchmarkResult> Crc32c(BenchmarkParameters parameters)
		{
			const long Size = 4096;
			var buffer = new byte[Size];
			for (int i = 0; i < Size; i++)
			{
				buffer[i] = (byte)'x';
			}

			var result = new BenchmarkResult(parameters);

			long bytes = 0;
			uint crc = 0;
			while (bytes < 500 * 1048576)
			{
				crc = Crc.Value(buffer, 0, buffer.Length);
				bytes += Size;
				result.FinishOperation();
			}

			result.AddBytes(bytes);
			result.AddMessage("(4K per op)");
			result.AddMessage(string.Format("CRC is {0}", crc));

			return new CompletedTask<BenchmarkResult>(result);
		}
示例#14
0
		private Task<BenchmarkResult> AcquireLoad(BenchmarkParameters parameters)
		{
			throw new NotImplementedException();
		}
示例#15
0
		private BenchmarkParameters CreateBenchmarkParameters(string benchmark)
		{
			var parameters = new BenchmarkParameters(options);

			switch (benchmark.ToLower())
			{
				case "fillseq":
					parameters.FreshDatabase = true;
					parameters.Method = WriteSeq;
					break;
				case "fillsync":
					parameters.FreshDatabase = true;
					parameters.Num /= 1000;
					parameters.Sync = true;
					parameters.Method = WriteRandom;
					break;
				case "fillbatch":
					parameters.FreshDatabase = true;
					parameters.EntriesPerBatch = 1000;
					parameters.Method = WriteSeq;
					break;
				case "fillrandom":
					parameters.FreshDatabase = true;
					parameters.Method = WriteRandom;
					break;
				case "overwrite":
					parameters.FreshDatabase = false;
					parameters.Method = WriteRandom;
					break;
				case "fill100k":
					parameters.FreshDatabase = true;
					parameters.Num /= 1000;
					parameters.ValueSize = 100 * 1000;
					parameters.Method = WriteRandom;
					break;
				case "readseq":
					parameters.Method = ReadSequential;
					break;
				case "readreverse":
					parameters.Method = ReadReverse;
					break;
				case "readrandom":
					parameters.Method = ReadRandom;
					break;
				case "readmissing":
					parameters.Method = ReadMissing;
					break;
				case "seekrandom":
					parameters.Method = SeekRandom;
					break;
				case "readhot":
					parameters.Method = ReadHot;
					break;
				case "readrandomsmall":
					parameters.Reads /= 1000;
					parameters.Method = ReadRandom;
					break;
				case "deleteseq":
					parameters.Method = DeleteSeq;
					break;
				case "deleterandom":
					parameters.Method = DeleteRandom;
					break;
				case "readwhilewriting":
					parameters.Method = ReadWhileWriting;
					break;
				case "compact":
					parameters.Method = Compact;
					break;
				case "crc32c":
					parameters.Method = Crc32c;
					break;
				case "acquireload":
					//parameters.Method = AcquireLoad;
					break;
				//case "heapprofile":
				//	HeapProfile();
				//	break;
				//case "stats":
				//	PrintStats("raven.storage.stats");
				//	break;
				//case "sstables":
				//	PrintStats("raven.storage.sstables");
				//break;
				default:
					throw new NotSupportedException("Unknown benchmark: " + benchmark);
			}

			return parameters;
		}
示例#16
0
		private async Task<BenchmarkResultSet> RunBenchmarkAsync(string benchmark, BenchmarkParameters parameters)
		{
			Debug.Assert(parameters.Method != null);

			var result = new BenchmarkResultSet(benchmark, parameters);

			var tasks = new Task<BenchmarkResult>[parameters.NumberOfThreads];
			for (var i = 0; i < parameters.NumberOfThreads; i++)
			{
				tasks[i] = parameters.Method(parameters);
			}

			await Task.WhenAll(tasks);

			for (var i = 0; i < parameters.NumberOfThreads; i++)
			{
				result.AddResult(i, tasks[i].Result);
			}

			return result;
		}
示例#17
0
		private async Task RefreshDatabaseAysnc(BenchmarkParameters parameters)
		{
			Debug.Assert(parameters.FreshDatabase);

			if (options.UseExistingDatabase)
			{
				Output("{0} : skipped (--use-existing-db is true");
				parameters.Method = null;
				return;
			}

			await OpenAsync();
		}
示例#18
0
		private Task<BenchmarkResult> SeekRandom(BenchmarkParameters parameters)
		{
			var random = new Random();
			var found = 0;

			var result = new BenchmarkResult(parameters);

			for (var i = 0; i < parameters.Reads; i++)
			{
				using (var iterator = storage.Reader.NewIterator(new ReadOptions()))
				{
					var k = random.Next() % options.Num;
					var key = string.Format("{0:0000000000000000}", k);
					Slice sliceKey = key;

					iterator.Seek(sliceKey);
					if (iterator.IsValid && sliceKey.CompareTo(iterator.Key) == 0)
						found++;

					result.FinishOperation();
				}
			}

			result.AddMessage(string.Format("({0} of {1} found)", found, parameters.Num));

			return Task.FromResult(result);
		}