Комментирование [attributeUsage (attributeTargets.property | attributeTargets.field, AllingMultiple = false)] в атрибуте, который мой класс десериализации использует половины, количество времени, которое требует перевода данных в список моего класса. Ниже приведено минимальное количество кода для воспроизведения проблемы: < /p>
Вот атрибут: < /p>
internal enum MODIFIERS { TRIM, TOUPPER, TOLOWER}
//RUN ONCE, THEN COMMENT OUT THIS NEXT LINE AND COMPARE THE RUNTIMES.
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
internal class InstructionAttribute : Attribute
{
public MODIFIERS[] INSTRUCTIONS;
internal InstructionAttribute(params MODIFIERS[] INSTRUCTIONS)
{
if (INSTRUCTIONS.Contains(MODIFIERS.TOUPPER) && INSTRUCTIONS.Contains(MODIFIERS.TOLOWER))
throw new Exception("sigh");
this.INSTRUCTIONS = INSTRUCTIONS;
}
}
< /code>
Вот класс, который он используется с: < /p>
internal class Pets
{
public string Dog1 { get; set; }
public string Dog2 { get; set; }
public string Cat1 { get; set; }
public string Cat2 { get; set; }
[Instruction(MODIFIERS.TOUPPER, MODIFIERS.TRIM)]
public string Snek { get; set; }
}
< /code>
Вот код для воспроизведения проблемы: < /p>
DataTable dt = new DataTable();
dt.Columns.Add("Dog1");
dt.Columns.Add("Dog2");
dt.Columns.Add("Cat1");
dt.Columns.Add("Cat2");
dt.Columns.Add("Snek");
for (int i = 0; i < 500000; i++)
{
var row = dt.NewRow();
row["Dog1"] = "Amos";
row["Dog2"] = "Holden";
row["Cat1"] = "Chisjen";
row["Cat2"] = "Naomi";
row["Snek"] = "Dawes";
dt.Rows.Add(row);
}
var sw = Stopwatch.StartNew();
var props = typeof(Pets).GetProperties().ToDictionary(k => k.Name, v=>v);
List pets = new List();
foreach (DataRow row in dt.AsEnumerable())
{
Pets p = new Pets();
foreach (DataColumn column in dt.Columns)
{
string valueToSave = row[column.ColumnName].ToString();
if (Attribute.IsDefined(props[column.ColumnName], typeof(InstructionAttribute)))
{
var attr = (InstructionAttribute)props[column.ColumnName].GetCustomAttribute(typeof(InstructionAttribute));
if(attr.INSTRUCTIONS.Contains(MODIFIERS.TRIM))
valueToSave = valueToSave.Trim();
if (attr.INSTRUCTIONS.Contains(MODIFIERS.TOUPPER))
valueToSave = valueToSave.ToUpper();
if (attr.INSTRUCTIONS.Contains(MODIFIERS.TOLOWER))
valueToSave = valueToSave.ToLower();
}
props[column.ColumnName].SetValue(p, valueToSave);
}
pets.Add(p);
}
Console.WriteLine($"Time Taken: {sw.ElapsedMilliseconds}ms");
< /code>
Атрибут. Определено, что вызывает увеличение количества времени, но я не понимаю, почему. Я предположил, что теги использования атрибутов использовались во время компиляции, так что он смог выявить проблемы до того, как код запустится ... но, похоже, он что -то делает во время выполнения.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... es-to-dese
Добавление атрибута в пользовательский атрибут удваивает время, необходимое для десеризации данных в класс ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Добавление одной простой строки в программу C ++ почти удваивает размер текста
Anonymous » » в форуме C++ - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-