- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
static string BuildPostData(IDictionary<string, string> d)
{
var s = "";
for (var i = 0; i < d.Count; i++)
{
var item = d.ElementAt(i);
var key = item.Key;
var val = item.Value;
s += String.Format("{0}={1}", key, HttpUtility.UrlEncode(val));
if (i != d.Count - 1)
s += "&";
}
return s;
}
Встретил вот такое.... переписал кодом ниже. Меньше мусора и работает намного быстрее.
static string BuildPostData(IEnumerable<KeyValuePair<s tring, string>> d)
{
return string.Join("&", d.Select(i => string.Format(CultureProvider.Common, "{0}={1}", i.Key, HttpUtility.UrlEncode(i.Value))));
}
neeedle 19.06.2013 18:23 # +6
santa_microbe 20.06.2013 07:38 # 0
neeedle 20.06.2013 10:52 # −4
Вот например, какую коллекцию кроме словаря aka dictionary<tkey, tvalue> они собираются получать на входе.
Зачем там задана культура, вдь с латиницей же работают люди, для чего энкодинг мне тоже не очень понятно.
Почему строку "&" не вынести в string.format, тогда можно было бы просто создать стрингбилдер и обойтись одним проходом по коллекции.
bormand 20.06.2013 10:55 # 0
Чтобы полученную строу параметров не распидорасило от val, в котором есть &, % или другие спецсимволы.
> Почему строку "&" не вынести в string.format
Потому, что после последнего параметра она не нужна.
P.S. Неужели в шарпе изкоробки нет нормального построителя HTTP запросов, который соблюдает все правила составления урлов? Чего-нибудь в духе
neeedle 20.06.2013 11:26 # 0
Энкодинг только на валью, а не на всю строку.
>>Потому, что после последнего параметра она не нужна.
Это прогблема сделать ее в стрингформате до?
Есть. WebClient, HttpRequest, HttpResponse, тысячи их.
roman-kashitsyn 20.06.2013 11:31 # 0
bormand 20.06.2013 11:31 # 0
Так он и энкодит только value. Ну я бы еще key, конечно, заэнкодил. А вот всю строку целиком энкодить нельзя (я думаю вы понимаете, почему).
> Это прогблема сделать ее в стрингформате до?
А слева она нахера? Чтобы потом ее потом отрезать сабстрингом?
neeedle 20.06.2013 11:45 # 0
roman-kashitsyn 20.06.2013 14:12 # 0
roman-kashitsyn 20.06.2013 10:59 # 0
> Я не знаю тонкостей задачи
По моему, всё вполне очевидно: нужно подготовить тело для POST-запроса.
bormand 20.06.2013 11:00 # 0
neeedle 20.06.2013 11:23 # 0
По коду сужу а не по названию метода.
roman-kashitsyn 20.06.2013 11:31 # 0
bormand 20.06.2013 11:36 # +2
roman-kashitsyn 20.06.2013 11:38 # +2
bormand 20.06.2013 11:42 # 0
Цитата: Ага, а параметры в урле передаются что ли?
Цитата: Это прогблема сделать ее в стрингформате до?
Цитата: для чего энкодинг
Ну ладно бы просто незнание, в незнании нет ничего страшного, всегда можно найти\спросить\додумать. Другое дело когда человек не знает, но считает, что он прав. Вот это и можно назвать анскильностью. А код с "&{0}={1}" - некорректной питушней.
neeedle 20.06.2013 11:49 # 0
А вы можете называть как хотите.
bormand 20.06.2013 11:54 # 0
Буду рад увидеть ваш вариант.
neeedle 20.06.2013 13:12 # 0
Я просто ошибся, чуточку.
bormand 20.06.2013 13:27 # +1
Гневные слова не за незнание, отнюдь, а только за стиль подачи этого незнания в духе "я все знаю, а вы все питушки" ;)
neeedle 20.06.2013 13:29 # 0
bormand 20.06.2013 15:31 # 0
Я не знаю тонкостей задачи, но мне кажется топикстартер тупо пользовался подсказками решарпера.
Это прогблема сделать ее в стрингформате до?
Ага, а параметры в урле передаются что ли?
Я ничего не имею против такого тона, когда говорящий им на 146% уверен в своей правоте. Да что тут далеко ходить, я сам так часто пишу ;) Но когда такой стиль речи юзают не зная темы - это не айс. В конце-концов, если не уверен, можно написать "емнип" или "имхо" или "мне кажется".
/thread
neeedle 20.06.2013 11:45 # 0
Хотя смотря какую.
Вот по этому хотелось бы задачку.
bormand 20.06.2013 11:46 # 0
neeedle 20.06.2013 11:48 # 0
roman-kashitsyn 20.06.2013 11:49 # 0
Попробуйте программно запостить сюда http://validator.w3.org/check документ на валидацию.
neeedle 21.06.2013 05:13 # 0
Отправил парочку, просмотрел тело, параметры в урле, метод - get.
roman-kashitsyn 21.06.2013 05:40 # 0
Моя первая ссыль - это url обработчика формы, на который приходит POST
indigo_projects 20.06.2013 11:11 # +1
bormand 20.06.2013 11:26 # 0
Той же самой причиной, по которой пыхеры пишут ' вместо ". Потому что так работает быстрее. И насрать им, что сам HTTP запрос исполняется на 3-4 порядка медленнее, чем его построение, и стринг билдер тут даст никому не нужный профит в жалкие наносекунды (зато явно снизит читабельность)...
Основная причина такого рода оптимизаций - анскильность (простите за слово из лексикона Царя, но оно мне понравилось), и незнание того, что оптимизировать нужно "горячий" код, а не все подряд.
neeedle 20.06.2013 11:31 # 0
bormand 20.06.2013 11:34 # 0
> одним
Код в студию.
neeedle 20.06.2013 11:43 # 0
А не исходя из ГК.
bormand 20.06.2013 11:48 # 0
indigo_projects 20.06.2013 11:56 # 0
neeedle 20.06.2013 13:14 # 0
roman-kashitsyn 20.06.2013 13:16 # 0
neeedle 20.06.2013 13:22 # 0
Но блин у стринга есть свой джоин.
Облажался номер два. :(
indigo_projects 20.06.2013 13:48 # 0
neeedle 20.06.2013 13:53 # 0
Кстати насчет кодировки, может быть можно было закодировать весь шаблон сразу? Вто так: HttpUtility.UrlEncode("{0}={1}") Так и кей и валью сразу же.
или нельзя?
roman-kashitsyn 20.06.2013 13:56 # 0
neeedle 20.06.2013 14:04 # 0
Но как это относится к шаблону? Строку же можно создать форматом и в самом UrlEncode.
roman-kashitsyn 20.06.2013 14:22 # 0
bormand 20.06.2013 15:37 # +1
P.S. А если распарсит - то это очень плохой сервер, поощряющий говнокод.
neeedle 20.06.2013 17:10 # 0
kegdan 21.06.2013 04:55 # 0
Да тут и по вызову понятно - линк вызывается от коллекции, которую нужно обработать, а не статично
kegdan 21.06.2013 04:52 # 0
bormand 21.06.2013 06:10 # 0
На си хотя бы. Но многие программисты на шарпах, пыхах и прочих высокоуровневых языках, к сожалению, думают, что если они будут делать нанооптимизации типа замены " на ' или сложения двух-трех строк через стрингбилдер, то вся программа по волшебству начнет работать быстрее...
eth0 21.06.2013 06:19 # 0
kegdan 21.06.2013 07:36 # 0
А вообще в VS 12 есть тесты производительности которое сами покажут тебе узкие места программы , но, почему-то, ими никто не пользуется
bormand 21.06.2013 08:58 # +3
Ну и еще, наверное, сказывается то, что про профайлер надо еще узнать...
kegdan 21.06.2013 10:43 # 0
Раз пошла такая тема... Кто откуда черпает знания о шарпике?
Я вот сейчас читаю "C# 4.0 и платформа .NET4 для профессионалов" - отличная книга.
indigo_projects 21.06.2013 11:14 # 0
kegdan 21.06.2013 12:38 # 0
neeedle 21.06.2013 13:00 # −3
kegdan 21.06.2013 15:18 # +3
neeedle 23.06.2013 04:58 # −2
kegdan 23.06.2013 07:58 # +3
Четверо слепых подошли к слону. Один дотронулся до ноги слона и сказал: «Слон похож на столб». Другой дотронулся до хобота и сказал: «Слон похож на толстую дубину». Третий дотронулся до живота слона и сказал: «Слон похож на огромную бочку». Четвёртый дотронулся до ушей и сказал: «Слон похож на большую корзину». И потом они начали спорить между собой относительно того, каков слон.
neeedle 23.06.2013 08:48 # −2
Конец!
Это просто шутка. :)
kegdan 23.06.2013 12:12 # −1
bormand 21.06.2013 16:56 # 0
С говнокода :) Мое знакомство с шарпиком, к сожалению, началось и закончилось лет 8 тому назад... С тех пор я им толком и не занимался.
neeedle 21.06.2013 13:03 # 0
Хотя две - три строки нормальный шарпей запилит в шаблон.
bormand 21.06.2013 16:57 # 0
Избавление от мусора это, внезапно, оптимизация. В данном случае - микрооптимизация. Т.к. параметров у запроса всяко не так уж и много, а прилетевший ответ и его парсинг напрягут кучу посильнее, чем этот жалкий килобайт.
neeedle 20.06.2013 11:29 # 0
Вот, что вы делаете для каждого элемента, больше ничего.
>>решарпер вообще тут ни при чем
Он у меня стоит и тоже подсказывает подписать вместо Dictionary, Ienumerable.
roman-kashitsyn 20.06.2013 11:32 # +2
neeedle 20.06.2013 11:46 # 0
Думал, что джоин к каждому элементу добавит.
bormand 20.06.2013 11:48 # 0
wvxvw 19.06.2013 18:50 # 0
bormand 19.06.2013 19:37 # 0
kostoprav 19.06.2013 20:08 # 0
neeedle 20.06.2013 05:09 # 0
santa_microbe 20.06.2013 07:27 # 0
indigo_projects 20.06.2013 08:11 # −2
neeedle 20.06.2013 11:50 # −3
bormand 20.06.2013 15:43 # 0
bormand 20.06.2013 15:47 # 0
neeedle 20.06.2013 17:12 # 0
anonimb84a2f6fd141 21.06.2013 03:41 # −2
kegdan 21.06.2013 05:06 # +2
Критикуешь - предлагай, предлагаешь - делай
guest 21.06.2013 00:10 # −1
Аффтор, хочешь быстрый код - избавься от string.Format. Простая конкатенация строк намного быстрее.
indigo_projects 21.06.2013 08:38 # +3
static string BuildPostData(IEnumerable<KeyValuePair<s tring, string>> d)
{
return string.Join("&", d.Select(i => i.Key + "=" + HttpUtility.UrlEncode(i.Value)));
}
Тесты показали прирост производительности на 33%. Guest - Вам респект.
bormand 21.06.2013 09:00 # +2
neeedle 21.06.2013 13:11 # −1
>> i.Key + "=" + HttpUtility.UrlEncode(i.Value)
Это юмор такой?
indigo_projects 21.06.2013 13:18 # +1
neeedle 21.06.2013 13:37 # −1
Лишние строки может убрать только сборщик мусора.
Чем больше вызовов сборщика мусора, тем больше убытки производительности.
Это написано в CLR via C#, которую вы читали.
Почему вы сейчас от своих слов отказываетесь, увидев, что плюсик сделает ваш миленький код быстрее, непонятно.
indigo_projects 21.06.2013 13:56 # 0
neeedle 21.06.2013 18:12 # 0
Я все еще думаю. Мне еще не доводилось строить в шарпе тело пост запроса в ручную, я всегда просто указывал параметры и отправлял запрос и смотрел что ушло, что пришло.
kegdan 21.06.2013 15:23 # +1
Плюс там милейшее S+= в цикле, что создает i строк в куче с арифметически прогрессируемым размером.
Join сначала все подстроки сделает, а потом сливает
kegdan 21.06.2013 15:30 # 0
neeedle 21.06.2013 18:07 # 0
Насчет формата:
Кроме литерала шаблона, нет не должен.
kegdan 21.06.2013 19:02 # 0
Думаю там стрингбилдер
kegdan 21.06.2013 19:08 # 0
StringBuilder result = new StringBuilder();
if (en.Current != null) {
result.Append(en.Current);
}
while (en.MoveNext()) {
result.Append(separator);
if (en.Current != null) {
result.Append(en.Current);
}
}
return result.ToString();
neeedle 21.06.2013 19:40 # 0
guest 21.06.2013 19:40 # 0
kegdan 21.06.2013 20:00 # 0
Она же в бинарной куче создаст i стрингов. Если словарь из 3 записей еще ничего. но если из 1000...
guest 21.06.2013 21:40 # 0
kegdan 21.06.2013 20:08 # 0
static string foo(IDictionary<string, string> d)
{
var s = new StringBuilder();
foreach (var key in d.Keys)
s.Append(key + "=" + HttpUtility.UrlEncode(d[key]) + "&");
return s.Remove(s.Length-1,1).ToString();
}
Ибо делать итератор и условие в цикле лишь для того что бы исключить первый амперсант - богомерзко
guest 21.06.2013 21:43 # +2
facepalm.jpg
Конкатенация никуда не делась...
kegdan 22.06.2013 12:40 # 0
Закопипастил
kegdan 21.06.2013 20:18 # 0
guest 21.06.2013 21:44 # 0
wvxvw 22.06.2013 15:18 # +1
Я думаю, парни, вы слабо оптимизировали, надо было сильнее оптимизировать.
kegdan 22.06.2013 16:45 # 0
В студию код на ассемблере
bormand 22.06.2013 17:52 # 0
> head = state == 0 ? key : value; } }
> return result; } }
Лисп головного мозга ;)
> host
Причем тут хост? Тут же query string собирают.
P.S. Что-то мне намекает, что этот "оптимизированный" код будет работать медленнее чем исходный. Да и линкед лист из интов (если он однонаправленный), если я не туплю, сожрет втрое больше памяти чем обычная строка (ссылка на следующий, значение, тип объекта для GC в каждой ноде).
P.P.S. Раз уж черезжопострингобилдер свелосипедили, то стоит и UrlEncode свелосипедить и заинлайнить руками ;)
wvxvw 22.06.2013 18:09 # 0
Будет ли он медленнее - а это вообще важно? При всех остальных показателях. Я так думаю, что код просто замечательный, и вне зависимости от скорости нужно использовать именно его, а не какое-нибудь другое решение.
wvxvw 22.06.2013 18:15 # 0
bormand 22.06.2013 19:37 # 0
pastebin, ideone
wvxvw 22.06.2013 19:50 # +1
wvxvw 22.06.2013 18:18 # 0
bormand 22.06.2013 19:36 # 0
wvxvw 22.06.2013 19:53 # +1