Ваш тест в корне ошибочен. Компилятор и среда выполнения - действительно умные звери и будут оптимизировать код как во время компиляции, так и во время выполнения (JIT-ing). В этом случае вы каждый раз делаете одно и то же , которое будет определено компилятором и оптимизировано, поэтому время будет одинаковым для каждого метода.
Попробуйте эту версию (у меня есть только .Net 2.0, отсюда и небольшие изменения):
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace ToStringTest
{
class Program
{
const int
iterationCount = 1000000;
static TimeSpan Test1()
{
Stopwatch watch = new Stopwatch();
watch.Start();
string str = "12345";
int j = 12345;
for (int i = 0; i < iterationCount; i++)
{
if (str == i.ToString())
{
//do my logic
}
}
watch.Stop();
return watch.Elapsed;
}
static TimeSpan Test2()
{
Stopwatch watch = new Stopwatch();
watch.Start();
string str = "12345";
int j = 12345;
for (int i = 0; i < iterationCount; i++)
{
if (Convert.ToInt32(i) == j)
{
//do my logic
}
}
watch.Stop();
return watch.Elapsed;
}
static void Main(string[] args)
{
Console.WriteLine("ToString = " + Test1().TotalMilliseconds);
Console.WriteLine("Convert = " + Test2().TotalMilliseconds);
}
}
}
и вы увидите огромную разницу. Один на два порядка быстрее другого. И это действительно очевидно, какой это.
Вам необходимо знать, что делают различные операции, чтобы понять, какая из них быстрее.
Для преобразования строки в int требуется следующее:
total = 0
for each character in string
total = total * 10 + value of charater
и ToString требует:
string = ""
while value != 0
string.AddToFront value % 10
value /= 10
Умножение намного проще и быстрее для процессора, чем деление. Учитывая выбор алгоритма с большим количеством умножений по сравнению с алгоритмом с большим количеством делений, всегда выбирайте первый, поскольку он всегда будет быстрее.
Тогда есть сравнение, сравнение int - int просто, загрузите каждое значение в регистр и сравните - пара машинных инструкций, и все готово. Сравнение между двумя строками требует проверки каждого символа в строках по одному - в приведенном вами примере это было 5 байт (целое число, вероятно, 4 байта), что больше обращений к памяти.