cad.net 你以为你会了排序(太累了不敲了剩下四个函数)
本帖最后由 你有种再说一遍 于 2024-11-23 02:20 编辑超过800ms人类是可以感知出来卡顿的,所以我都尽可能把每个命令的时间下降到这个范围内.
从一分钟优化到5秒是本分.
从5秒优化到1秒是功力.
从1秒优化到800ms那就是对于编程语言/数据结构/硬件的深入理解了.
发现大家敲了那么多年只会写个Linq排序,太ugly了.(我刚敲C#的时候甚至是List.Insert来排序...)
因此怎么排序最快呢?分析至今为止的排序算法.
PS:发现不写笔记的话,真的没有总结和归纳,学到的东西总是缺那么一块,记得写好笔记.
虽然Linq内部是快排,但是Linq存在开销,尤其是新建数组.
以及利用了JIT特化来进行5次之后的重写,这些都是消耗时间的.
在图形学上面难以接受,明明不用新建,只需要排序.
我也不需要特化啊,我要去直接写一个最快啊.
由于大家觉得,业务上面速度还能接受,就没有学习下去了.
就像不知道四叉树如此快之前的我...
从业务能跑起来,再到追求速度,需要上一个台阶.
那么快排上面还有什么不足呢?
那就是内存布局,这个就是SOA结构化解.
从行式结构到列式结构.
那么SOA是怎么加速的呢?
CPU的预读机制能够一次性搬运8bit次方长度数据.
每秒13G...
所以你现在知道你写的东西多慢了吧...
快排和堆排是最快的两种算法,
其中堆排只有在大型排序才会领先快排.
那么SOA+快排,这才是图形学的归宿.
https://www.cnblogs.com/JJBox/p/18558660
(似乎博客园坏了,20241122,23:19剩余四个函数)
利用它,你可以在矩阵变换中获得更快的加速.
SOA+SIMD+矩阵Strassen算法,
也就是平移是矩阵中最快的,它是任务并行的,只需要加法器,加法器内也是并行的,而且全量缓存命中的,无敌了啊.
而且啊而且啊,之前写矩阵搞不定的泛型,
现在都已经有INumber接口了,
在NET7以下是没有的,只能通过IComparable接口来进行
double value1 = 10d;
double value2 = 20d;
int result = value1.CompareTo(value2);
if (result > 0) {
Console.WriteLine($"{value1} is greater than {value2}");
} else if (result < 0) {
Console.WriteLine($"{value1} is less than {value2}");
} else {
Console.WriteLine($"{value1} is equal to {value2}");
}
但是啊但是啊,它模板特化有问题啊!!!速度上不去啊!!
得分别写N个矩阵类型啊...还是C++模板编程好用
ARX许多人也是不知道有SOA这回事.
不过不重要,因为从这篇文章开始,你就会翻看我之前的论坛文章了,以前觉得概念和代码无法关联的地方应该都能结合理解了.(嘻嘻)
用上SIMD如果没有20倍以上的提速基本上白用.
SIMD极限通常在35-40倍,受限于总带宽速度.
不学优化相当于没学过编程的核心,因为它真的很美,
能写出比桌子还快的功能来.
桌子或者微软可以为了兼容性放弃速度,而我可以不用,你也可以不用. 顶一下,很不错 我没以为我懂了排序:funk: 很强
页:
[1]