В диспетчере устройств, вкладка контроллеры запоминающих устройств оба raid контроллера определяются.он гуевый
Как это работает?
(name[1] - '0')
неявно преобразуется к int. что бы понимать и использовать такие приемы, надо накопить некоторую базу программирования вообще, и знания конкретного языка в частности ))"Лучше" бывает разное: скорость работы, затраты памяти, понятность кода.
using System;
using System.Diagnostics;
using System.Text;
namespace parse_fn_bench
{
static class Program
{
static (char, int, char, int) Parse1(this string fn)
{
var c1 = fn[0];
if (!int.TryParse(fn.Substring(1, 2), out var n1))
throw new Exception("not integer value");
var c2 = fn[3];
if (!int.TryParse(fn.Substring(4, 3), out var n2))
throw new Exception("not integer value");
return (c1, n1, c2, n2);
}
static (char, int, char, int) Parse2(this string name)
{
char c1 = name[0];
int n1 = (name[1] - '0') * 10 + (name[2] - '0');
char c2 = name[3];
int n2 = (name[4] - '0') * 100 + (name[5] - '0') * 10 + (name[6] - '0');
return (c1, n1, c2, n2);
}
static string[] bulk = default;
static void fill(int n = 10)
{
bulk = new string[n];
var rnd = new Random();
for (var i = 0; i < bulk.Length; i++)
bulk[i] = (new StringBuilder()
.Append((char)('A' + (char)rnd.Next(0, 26)))
.Append(rnd.Next(10, 99).ToString())
.Append((char)('A' + (char)rnd.Next(0, 26)))
.Append(rnd.Next(100, 999).ToString())
.ToString());
}
static void test(int n = 10)
{
if (n > bulk.Length)
n = bulk.Length;
for (var i = 0; i < n; i++)
Console.WriteLine($"file name '{bulk[i]}'\n"
+ $"\t test parsings {bulk[i].Parse1()}\n"
+ $"\t parsing result is equal {bulk[i].Parse1() == bulk[i].Parse2()}");
}
static void Main(string[] args)
{
// для проверки идентичности парсинга на малом массиве - 10 значений
//fill();
//test();
var n = 100_000;
// массивы что бы убрать влияние динамического создания объектов
var r1 = new object[n];
var r2 = new object[n];
var sw = new Stopwatch();
sw.Start();
fill(n);
var tsf = sw.Elapsed;
sw.Reset();
sw.Start();
for (var i = 0; i < n; i++)
r1[i] = bulk[i].Parse1();
var ts1 = sw.Elapsed;
sw.Reset();
sw.Start();
for (var i = 0; i < n; i++)
r2[i] = bulk[i].Parse2();
var ts2 = sw.Elapsed;
sw.Stop();
// весь вывод выносим за пределы замера
// вывод r1.cnt/r2.cnt что бы сборщик мусора не успел возбудиться ))
Console.WriteLine($"{tsf.Hours:00}:{tsf.Minutes:00}:{tsf.Seconds:00}.{tsf.Milliseconds:000}");
Console.WriteLine($"{ts1.Hours:00}:{ts1.Minutes:00}:{ts1.Seconds:00}.{ts1.Milliseconds:000} r1.cnt {r1.Length}");
Console.WriteLine($"{ts2.Hours:00}:{ts2.Minutes:00}:{ts2.Seconds:00}.{ts2.Milliseconds:000} r2.cnt {r1.Length}");
}
}
}
как минимум один контрвопрос + будет ли это хорошо?
вообразим сферические параметры кеширования по умолчанию в вакууме, создание тяжелого соединения на каждый запрос к приложению, все равно будет быстрее убивать такой сервер. только если запросы идут раз в сутки, тогда это оптимально ))