C# производственное
Jan. 8th, 2014 01:03 amпо долгу службы неожиданно оказалось нужно оптимизировать относительно тривиальный код (потому что bing pipeline требует, чтобы наш кусок выполнялся за 10 ms, а в этом нашем куске мастурбации с коллекциями по 10К объектов).
в процессе оптимизации открылся ряд вещей, о которых при написании обычного кода просто не задумывается никто.
например, оказалось, что properties are no-go в такого рода коде. за то время, пока происходит доступ - просто доступ - к property, можно десять операций с плавающей точкой сделать.
но вот в кое-что не вторчу никак. например, List[double] размером 10К сортируется за пол-миллисекунды. а List[MyClass] с компарером по тому же double - в десять раз медленнее. wtf? это из-за одного indirection-a? так ведь List[MyStruct] тоже в десять раз медленнее.
в процессе оптимизации открылся ряд вещей, о которых при написании обычного кода просто не задумывается никто.
например, оказалось, что properties are no-go в такого рода коде. за то время, пока происходит доступ - просто доступ - к property, можно десять операций с плавающей точкой сделать.
но вот в кое-что не вторчу никак. например, List[double] размером 10К сортируется за пол-миллисекунды. а List[MyClass] с компарером по тому же double - в десять раз медленнее. wtf? это из-за одного indirection-a? так ведь List[MyStruct] тоже в десять раз медленнее.
(no subject)
Date: 2014-01-08 08:25 pm (UTC)(no subject)
Date: 2014-01-08 08:26 pm (UTC)(no subject)
Date: 2014-01-08 08:54 pm (UTC)но мне нужен код, а ни List, ни Linq не умеют partial sort.
(no subject)
Date: 2014-01-08 11:14 pm (UTC)если бы stdlib меньше оглядывался на джаву, а инлайнер был умнее, компареры могли бы иметь 0% оверхед.
причем инлайнера нынешнего даже хватает, можно написать на генериках список с втыкающимся компаратором без оверхеда
но, увы, дефолтный лист этого не делает.
(no subject)
Date: 2014-01-09 01:39 am (UTC)(no subject)
Date: 2014-01-10 04:06 am (UTC)