Programming

Маленькие радости большого СиШарпа

4 Mar 2009 19:56
0
(Текст записи скрыт. Показать...)
Есть у нас в компании программист Саня. Дотошный. Всё бы ему ldasm'ом по коду походить. Иногда находит интересное.

Казалось бы, чем отличается такое:

int i = 10;
string s = 'Vasya' + i.ToString();

от

int i = 10;
string s = 'Vasya' + i;

Казалось бы, ничем. И например РеШарпер советует - убери каст, не нужно оно.

Авотфиг.

Во втором случае - имеет место боксинг, который аллоцирует на 80 байт объект под этот инт, потом разворачивает и кастит. В первом случае каст напрямую.

Рыдали, откатывали логгирование, почиканное по совету РеШарпера. Осторожнее с этой игрушкой дьявола, коллеги.
Отправлено 04.03.2009 в 21:36
Отвечает на сообщение 292116
0
Что-то мне подлсказывает, что это зависит от настроек компилятора.
Отправлено 04.03.2009 в 22:05
Отвечает на сообщение 292117
0
Два вопроса:
1. раз интересуют такие тонкости, то почему C#?
2. раз уж C#, то неужели ж это его самая большая неоптимальность?
Что-то подсказывает, что там закопано намного больше проблемы, чем тривиальное создание временного объекта.
Отправлено 04.03.2009 в 23:52
Отвечает на сообщение 292123
0
Алексей Буйницкий wrote:
>
> Два вопроса:
> 1. раз интересуют такие тонкости, то почему C#?
> 2. раз уж C#, то неужели ж это его самая большая неоптимальность?
> Что-то подсказывает, что там закопано намного больше проблемы,
> чем тривиальное создание временного объекта.


1. СиШарп потому что легаси. Потому что уже почти три года сервер на нём живёт, и решение до меня принималось.

2. Я же про _маленькие_ радости рассказываю. Есть и большие, бесспорно. Но про них книги надо писать, в блоге не расскажешь. Да и не очень-то весело будет читать многобукв.

Ну и эта. Саня, он дотошный. Вниз заглядывает для фана личного. За что я его неодолимо уважаю, кстати.
Отправлено 04.03.2009 в 23:50
Отвечает на сообщение 292117
0
Денис Перов wrote:
>
> Что-то мне подлсказывает, что это зависит от настроек
> компилятора.


Каких именно? ну то есть подсказывает - это про ощущение или у тебя есть точный ответ? Мне правда интересно.
Отправлено 04.03.2009 в 23:34
Отвечает на сообщение 292116
0
а string.Format("Vasya{0}", i) смотрели?
Отправлено 04.03.2009 в 23:39
Отвечает на сообщение 292116
0
я к чему спросил -- string s = s1 + s2, где s1, s2 - string, это тоже зло. ну я думаю, вы сами знаете :)
Отправлено 04.03.2009 в 23:53
Отвечает на сообщение 292132
0
Сергей Лобко-Лобановский wrote:
>
> а string.Format("Vasya{0}", i) смотрели?


Нет, посмотрю кстати.

> я к чему спросил -- string s = s1 + s2, где s1, s2 - string, это
> тоже зло. ну я думаю, вы сами знаете :)


Угу, на собеседования за это спрашиваю практически обязательно. Ну если стрингбилдер использовать, ситуация не меняется, это проверено. Тут именно фишка в невсегдашнем касте.

Кстати, если складывать константы - компилятор не плодит объектов, в этом смысл посыла собственно. Именно поэтому в одном из случаев не плодится объект.
Отправлено 05.03.2009 в 01:38
Отвечает на сообщение 292136
0
Евгений Овчинников wrote:
>
> Сергей Лобко-Лобановский wrote:
> >
> > а string.Format("Vasya{0}", i) смотрели?
>
> Нет, посмотрю кстати.
>
> > я к чему спросил -- string s = s1 + s2, где s1, s2 - string,
> это
> > тоже зло. ну я думаю, вы сами знаете :)
>
> Угу, на собеседования за это спрашиваю практически обязательно.
> Ну если стрингбилдер использовать, ситуация не меняется, это
> проверено. Тут именно фишка в невсегдашнем касте.
>
> Кстати, если складывать константы - компилятор не плодит
> объектов, в этом смысл посыла собственно. Именно поэтому в одном
> из случаев не плодится объект.


А какой там именно код компайлером генерится в втором случае? Что-то вроде --

string s = "Vasya" + ((IConvertible)i).ToString()

?

Если да, тогда понятно, откуда боксинг.
В ветке ещё 2 сообщения
Отправлено 05.03.2009 в 03:27
Отвечает на сообщение 292116
0
Отличный пост!

Все же принято(приятно?:) считать C# таким лазганом, с которым очень удобно попадать по бизнес-целям, не опасаясь попасть по своим(коллегам и проектам).

А приглядишься - и видишь обычный болтер.
Not such a devastating as the heavy one, но все равно - в бою в руки давать можно только space marines.

Впрочем, настоящие воины Империума во всех отраслях индустрии используют только heavy weapons, которыми брутально устанавливают вокруг себя выжженную землю - на которой остается только особо прочное legacy.

Иногда позавидуешь perl guys, у которых иные тактики, позволяющие жить в волшебных облаках высокоуровневых абстракций - но для нас это все ересь и путь хаоса.
"Чти императора — изгони варваров"
Отправлено 05.03.2009 в 07:39
Отвечает на сообщение 292153
0
iL' Dagger wrote:
>
> Отличный пост!
>
> Все же принято(приятно?:) считать C# таким лазганом, с которым
> очень удобно попадать по бизнес-целям, не опасаясь попасть по
> своим(коллегам и проектам).
>
> А приглядишься - и видишь обычный болтер.
> Not such a devastating as the heavy one, но все равно - в бою в
> руки давать можно только space marines.
>
> Впрочем, настоящие воины Империума во всех отраслях индустрии
> используют только heavy weapons, которыми брутально устанавливают
> вокруг себя выжженную землю - на которой остается только особо
> прочное legacy.
>
> Иногда позавидуешь perl guys, у которых иные тактики, позволяющие
> жить в волшебных облаках высокоуровневых абстракций - но для нас
> это все ересь и путь хаоса.
> "Чти императора — изгони варваров"


Спасибо, повеселило.
Отправлено 11.03.2009 в 15:35
Отвечает на сообщение 292116
0
Да, так сразу и не допрешь, а разница заметная:
Boxing: 30098 ms
Boxing: 27691 ms

10% выходит. Спасибо за информацию!

АПД Со string.Format та же петрушка. Но там выигрыш меньше, потому что Format сам по себе тормозной.
Списки доступа
  • Подписчики [675]
  • Белый список [19]
  • Черный список [3]
Права доступа
Вы можете читать группу, но не можете отвечать на сообщения и создавать новые темы.
Доступ для остальных:
анонимы : могут читать
новые : могут читать
постоянные : полный доступ

Copyright © 2019 ООО "ДТФ.РУ". Все права защищены.

Воспроизведение материалов или их частей в любом виде и форме без письменного согласия запрещено.

Замечания и предложения отправляйте через форму обратной связи.

Пользовательское соглашение