Я проводил некоторые тесты eprofile медленной области кода. Это в Visual Studio 2008 и .NET 2 (полностью исправлено). Около 32% моих вычислений использует формула Хаверсайна. Для этого требуется два синуса, два косинуса, квадратный корень и арксинус - все с использованием стандартной библиотеки .NET Math (т. Е. Math.Sin, Math.Asin, Math.Sqrt). Я был в состоянии легко кэшировать косинусы - что привело к ускорению функции Хаверсайна примерно на 25-30%.
В профиле я вижу __CIasin_pentium4 и __CIasin, которые ничего не находят в Google, за исключением таких вещей, как дампы стека, которые публикуют люди.
Вариант pentium4 собирает примерно вдвое больше образцов (как включающих, так и эксклюзивных). Я предполагаю, что это синусоида, но действительно ли это намного дороже синуса? В профиле нет признаков синуса, хотя будет вычислено вдвое больше.
Являются ли обе эти функции арксинусами или синусом? Если нет, то что они представляют?
Да, я видел различные статьи и посты в Интернете и здесь о быстрых синусах. Мне действительно нужна точность вычисленного синуса, а не таблица поиска или усеченная серия Тейлора. Я использую Haversine, чтобы вычислить и / или сравнить расстояния на поверхности Земли. Точность 10 м (минимальное ИМХО для моего приложения) равна примерно 1/640000 радиан.
Одной из мыслей о скорости является умножение тригонометрических тождеств. Хотя это приведет к увеличению числа триггерных функций, они станут зависимыми только от отдельных конечных точек и, следовательно, станут кешируемыми. Другой - развернуть арксинус и квадратный корень для моих сравнений. Я думаю, что у последнего есть много возможностей для улучшения, однако в данный момент я пытаюсь понять, что занимает время обработки и что именно представляют функции __CIasin.