明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 347|回复: 3

[图形系统] cad.net 你以为你会了排序(太累了不敲了剩下四个函数)

  [复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 你有种再说一遍 于 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倍,受限于总带宽速度.
不学优化相当于没学过编程的核心,因为它真的很美,
能写出比桌子还快的功能来.
桌子或者微软可以为了兼容性放弃速度,而我可以不用,你也可以不用.
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
顶一下,很不错
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
我没以为我懂了排序
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 06:14 , Processed in 0.153504 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表