S>?
S>Кстати, с .net native отладка интероп-кода стала немного проще (по ссылке есть в том числе и про [Out]).
Поясните пожалуйста — использование атрибутов не уменьшает производительность? Неужели на разбор атрибутов не тратится(хоть и очень мало) ресурсы CPU?
Мне всегда казалось unsafe код нужен для минимизации задержки вышеописанных действий если в этом есть смысл...
Здравствуйте, Аноним, Вы писали:
А>Поясните пожалуйста — использование атрибутов не уменьшает производительность? Неужели на разбор атрибутов не тратится(хоть и очень мало) ресурсы CPU?
Этими атрибутами интересуется .NET при компиляции в машкод вызовы таких функций.
Здравствуйте, hardcase, Вы писали:
H>Так мы же не строки маршаллим, атрибуты должны быть In/Out излишни.
Они не то чтобы излишни, скорее позволяют пропустить при маршаллинге часть операций. Для каких типов это делается, для каких нет — темна вода во облацех нигде не документировано. Точнее,
Сочетание атрибутов InAttribute и OutAttribute особенно удобно при работе с массивами и форматированными непреобразуемыми типами. Вызывающие объекты воспринимают изменения, внесенные в эти типы вызываемыми объектами, только когда применяются оба атрибута. Поскольку для этих типов необходимо копирование в процессе маршалинга, для уменьшения числа ненужных копий используются атрибуты InAttribute и OutAttribute
и в принципе всё.
Если ничего не путаю (с интеропом практически не возился) до .net native проверить результирующий код можно было только подрубанием отладчика и изучением вывода jit.
Здравствуйте, Аноним, Вы писали:
А>Поясните пожалуйста — использование атрибутов не уменьшает производительность? Неужели на разбор атрибутов не тратится(хоть и очень мало) ресурсы CPU? А>Мне всегда казалось unsafe код нужен для минимизации задержки вышеописанных действий если в этом есть смысл...
Атрибуты учитываются только при jit-компиляции, она выполняется один раз за время работы программы. Есть смысл или нет, проверить просто: пишем код, замеряем время
Re[4]: Struct to double[]
От:
Аноним
Дата:
23.06.14 16:30
Оценка:
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Аноним, Вы писали:
А>>Marshal.Copy??? вы уверены??? А>>А пример можно?
H>IntPtr можно получить из GCHandle (это "safe" аналог конструкции fixed). H>Только писанины довольно много
Но в таком случае тактов больше чем в начальном примере.
Сначала создаем структуру GCHandle(дорогостоящая операция когда борьба идет за микросекунды) потом копируем через Marshal.Copy туда данные. А вопрос стоит: как можно по производительности быстрее написать?....
Re[2]: Struct to double[]
От:
Аноним
Дата:
23.06.14 16:54
Оценка:
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Аноним, Вы писали:
А>>Нужно быстро преобразовать структуру в массив double. А>>вот код
H>Ваш код можно сократить и исправить ошибку.
H>
А>Такая запись действительно производительней всего, особенно если заместо array.Length * sizeof(double) написать 128 на свой страх и риск!
А массив из 128 даблов тогда зачем создаешь (я так понял 16 будет достаточно)?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Struct to double[]
От:
Аноним
Дата:
24.06.14 05:14
Оценка:
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Аноним, Вы писали:
А>>Такая запись действительно производительней всего, особенно если заместо array.Length * sizeof(double) написать 128 на свой страх и риск!
H>А массив из 128 даблов тогда зачем создаешь (я так понял 16 будет достаточно)?
Опечатка в типографии
Re[2]: Struct to double[]
От:
Аноним
Дата:
25.06.14 06:37
Оценка:
Здравствуйте, romangr
Вы писали
R>Здравствуйте, <Аноним>, Вы писали:
А>>Нужно быстро преобразовать структуру в массив double. А>>вот код
А>>
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, romangr
А>Потому что вот такой код не будет собираться: А>
А> class Program
А> {
А> static MyStruct str = new MyStruct(1024.0);
А> static unsafe void Main(string[] args)
А> {
А> // var str = new MyStruct(1024.0);
А> var arr = new double[16];
А> var pstr = &str;
А> fixed (double* parr = &arr[0])
А> {
А> var pstr1 = (MyStruct*)parr;
А> *pstr1 = *pstr;
А> }
А> PrintArray(arr);
А> }
А> static void PrintArray(double[] array)
А> {
А> foreach (var item in array)
А> {
А> Console.WriteLine(item);
А> }
А> }
А> }
А>
В моем случае MyStruct лежит на стеке, ей не надо делать fixed.
В твоем — fixed требуется, т.к. статическое поле считается уже moveable variable.
Такой код будет работать: