С C # какой из них быстрее - System.Convert.ToString (objThatIsString) или (string) objThatIsString? - PullRequest
4 голосов
/ 26 мая 2009

или objThatIsString.ToString (), как было указано в ответах. Быстрее не мудрее ..

Ответы [ 6 ]

18 голосов
/ 26 мая 2009

@ Тайс: Вот быстрый тест:

public class ToStringTest
{
    private object mString = "hello world!";
    Stopwatch sw = new Stopwatch();
    private List<long> ConvertToStringTimes = new List<long>();
    private List<long> ToStringTimes = new List<long>();
    private List<long> CastToStringTimes = new List<long>();

    public ToStringTest()
    {

        for (int i = 0; i < 100000; i++)
        {
            sw.Start();
            ConvertToString();
            sw.Stop();
            ConvertToStringTimes.Add(sw.ElapsedTicks);
            sw.Reset();

            sw.Start();
            ToString();
            sw.Stop();
            ToStringTimes.Add(sw.ElapsedTicks);
            sw.Reset();

            sw.Start();
            CastToString();
            sw.Stop();
            CastToStringTimes.Add(sw.ElapsedTicks);
            sw.Reset();    
        }
        Console.WriteLine("Average elapsed ticks after converting {0} strings",ConvertToStringTimes.Count);
        Console.WriteLine("ConvertToString: {0} ticks", ConvertToStringTimes.Average() );
        Console.WriteLine("ToString: {0} ticks", ToStringTimes.Average());
        Console.WriteLine("CastToString: {0} ticks",  CastToStringTimes.Average());
    }

    private string ConvertToString()
    {
        return Convert.ToString(mString);
    }

    public override string ToString()
    {
        return mString.ToString();
    }

    public string CastToString()
    {
        return (string) mString;
    }
}

Результат:

Среднее количество прошедших тиков после преобразования 100000 строк

ConvertToString: 611,97372 тика

ToString: 586,51461 тиков

CastToString: 582,25266 тиков

14 голосов
/ 26 мая 2009

Прямое приведение не должно выполнять никаких проверок, кроме проверки типа во время выполнения - я бы ожидал , что приведение происходит быстрее.

Вы также можете рассмотреть objThatIsString.ToString(); поскольку (для string) это просто return this;, оно должно быть быстрым - конечно, быстрее, чем Convert.ToString. Тогда гонка проходит между проверкой типа во время выполнения и виртуальным вызовом; на самом деле, оба очень, очень быстрые.

5 голосов
/ 26 мая 2009

Составление происходит быстрее.

Convert.ToString в конце концов выполнит бросок после некоторого накладного расхода. Он фактически делает это в форме попытки привести его к IConvertible, а затем вызвать для него виртуальный метод ToString. Итак, это виртуальный вызов, который выполняет фактическое приведение к String.

2 голосов
/ 26 мая 2009

Приведение (string)obj должно быть быстрее. Класс Convert фактически конвертирует объекты другого класса и в этом случае будет работать медленнее.

1 голос
/ 26 мая 2009

Есть поговорка «Числа рассказывают сказку». Это означает, что вместо того, чтобы что-то предполагать, вы также можете измерить это!

Итак, заверните тестовое приложение, запустите тесты и подтвердите результаты!

Истинный вопрос может быть: Как измерить, какой путь быстрее?

0 голосов
/ 26 мая 2009

Я думаю, что (string) objThatIsString быстрее, потому что компилятор сможет выполнить это преобразование во время компиляции.

Тем не менее, Джефф Этвуд считает, что в конце концов это не важно ( Код ужаса: печальная трагедия театра микрооптимизации )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...