Десериализация JSON. C# обрабатывает в 16 раз(!) дольше JS

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Имеется JSON на 25000 уровней (или строк, или как правильно выразиться :-)).

Ранее на старой версии ZP работал через JS, используя код:
JavaScript:
var obj = {-Variable.JSON-};
var out = '';
for (var i = 0; i < obj.response.length; i++){
    out += obj.response[i].uid+";"+obj.response[i].sex+";"+obj.response[i].bdate+";"+obj.response[i].country+";"+obj.response[i].city+";"+obj.response[i].relation+";"+obj.response[i].deactivated+"\r\n"
}
Замерил скорость скорость - 0.8 секунды.

Обновился до последней версии ZP. Подключил Newtonsoft.Json.dll, в общем коде прописал классы.
Уж на C# должно быть быстрее, подумал я, ну или хотя бы так же.
Код:
string json = project.Variables["JSON"].Value;
var startime = DateTime.Now;
var result = String.Empty;
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
for (int i = 0; i < obj.response.Count; i++)
{
string str = String.Format("{0};{1};{2};{3};{4};{5};{6}", obj.response[i].uid, obj.response[i].sex, obj.response[i].bdate, obj.response[i].country, obj.response[i].city, obj.response[i].relation, obj.response[i].deactivated);
result = result+str+"\r\n";
}
project.Variables["runtime"].Value = DateTime.Now.Subtract(startime).ToString();
return result;
Обработка заняла 16 секунд. 16, Карл!
Как такое может быть?

Может я что-то неправильно делаю? Помогите разобраться.
 
Последнее редактирование модератором:

Sz5

Client
Регистрация
10.12.2012
Сообщения
157
Благодарностей
186
Баллы
43
++++ интересует подобная проблема)
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
1. obj.response.Count - в переменную Count
2. obj.response итый - тоже в переменную
3. result = result+str+"\r\n"; нельзя большие строки складывать, это долго, надо использовать StringBuilder
должно что-то типа получиться:
Код:
string json = project.Variables["JSON"].Value;
var startime = DateTime.Now;
var result = new StringBuilder();
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
var count = obj.response.Count;
for (int i = 0; i < count; i++)
{
    var currObject = obj.response[i];
    string str = String.Format("{0};{1};{2};{3};{4};{5};{6}", currObject.uid, currObject.sex, currObject.bdate, currObject.country, currObject.city, currObject.relation, currObject.deactivated);
    result.AppendLine(str);
}
project.Variables["runtime"].Value = DateTime.Now.Subtract(startime).ToString();
return result.ToString();
4. Мерить первый запуск дело тоже неблагодарное, т.к. мерите еще и загрузку dll, что в разы дольше самой операции.
5. Я бы еще и от string.format избавился, заменив ее на несколько вызовов result.Append

ну а вообще проект в студию с примером
 
  • Спасибо
Реакции: Lexicon и ibred

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
1. obj.response.Count - в переменную Count
2. obj.response итый - тоже в переменную
3. result = result+str+"\r\n"; нельзя большие строки складывать, это долго, надо использовать StringBuilder
Огонь! Теперь обработка занимает 0.1 секунды!
Огромное спасибо за оказанную помощь и пояснение.
4. Мерить первый запуск дело тоже неблагодарное, т.к. мерите еще и загрузку dll, что в разы дольше самой операции.
5. Я бы еще и от string.format избавился, заменив ее на несколько вызовов result.Append

ну а вообще проект в студию с примером
Собственно, Ваши 3-и первые пункта снимают все проблемы с долгой обработкой.
Если это актуально для Вас, как для администратора, могу выслать проект сегодня - завтра. Дайте знать, если что.
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
0.1 секунды (в 8 раз быстрее) вполне годный результат :-)
можете не высылать.
 
  • Спасибо
Реакции: ibred

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)