string.IsNullOrEmpty performance

Jun 05, 2008 19:59

Есть идеи в чем проблема? Неужели системные функции не инлайнятся?

class Program
{
const int i = 200000000;
static void Main()
{
Console.Write("TestString: ");
var s = Console.ReadLine();

bool _;

var sw = Stopwatch.StartNew();
for (var j = 0; j < i; j ( Read more... )

Leave a comment

Comments 10

antilamer June 5 2008, 16:11:23 UTC
1) А насколько медленнее получается?
2) Инлайнятся или нет - остановите дебаггером и посмотрите disassembly.

Reply

xkip June 6 2008, 07:52:27 UTC
Inlining происходит, на сколько я знаю, на уровне JIT. А JIT компиляция не делает оптимизаций, когда подключен дебаггер (даже если это релизный проект). Поэтому для чистоты эксперемента я запускал в релизе без дебаггера. Если продебажиться, видно что ничего не инлайнится.

медленнее второй вариант у меня получался на ~30% (700/900)

Reply

(The comment has been removed)

xkip June 6 2008, 10:12:14 UTC
> по дефолту не делает, но это зависит от твоих настроек
а где можно это настроить? Думаю это было бы интересно для подобных наблюдений за JIT.

Reply


metaclass June 5 2008, 17:04:06 UTC
Добавьте обращение к _ после проверки. Похоже, компилятор оптимизирует что-то, из-за отсутствия обращения к результату.

Reply

xkip June 6 2008, 07:59:55 UTC
Похоже это действительно так. В следующем эксперементе результат противоположный, и теперь я не могу понять почему первая часть медленне (остальные 3 одинаково быстро)

class Program {
const int MAX = 200000000;
public static int c;
static void Main() {
Console.Write("TestString: ");
var s = Console.ReadLine();

bool _;

var sw = Stopwatch.StartNew();
for (int i = 0; i < MAX; i++) {
_ = s == null || s.Length == 0;
c += _ ? 1 : 0;
}

Console.WriteLine(sw.ElapsedMilliseconds);

sw = Stopwatch.StartNew();
for (int i = 0; i < MAX; i++) {
_ = string.IsNullOrEmpty(s);
c += _ ? 1 : 0;
}

Console.WriteLine(sw.ElapsedMilliseconds);

sw = Stopwatch.StartNew();
for (int i = 0; i < MAX; i++) {
_ = IsNullOrEmpty(s);
c += _ ? 1 : 0;
}

Console.WriteLine(sw.ElapsedMilliseconds);

sw = Stopwatch.StartNew();
for (int i = 0; i < MAX; i ( ... )

Reply


tonybelol June 5 2008, 18:12:51 UTC
Где писали-то?

asp.net 2.0:
первый
1 : True, 1372
2 : True, 1534
второй раз
1 : True, 1310
2 : True, 1580

Reply


(The comment has been removed)

djuffin June 5 2008, 20:11:18 UTC
>>- у stopwatch надо обязательно вызывать Stop перед тем, как
>> интересоваться сколько все-таки прошло времени;

не обязательно

Reply

(The comment has been removed)

(The comment has been removed)


7j0lesya12_24 June 19 2008, 08:31:20 UTC
Прикольный пост... :)
Всегда завидовала творческим людям... Когда нибудь и я научусь...
Буду очень признательна, если поможете мне победить в конкурсе красоты.
Победа в этом конкурсе ОЧЕНЬ много для меня значит! Заранее благодарна всем, кто откликнется на мою просьбу.

С Уважением, Олеся.

Reply


Leave a comment

Up