明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 705|回复: 8

[图形系统] cad.net 排序和搜索(扫描线的必要测试)

[复制链接]
发表于 2025-1-23 17:58:10 | 显示全部楼层 |阅读模式
本帖最后由 你有种再说一遍 于 2025-1-26 17:20 编辑

没想到二分法居然真的那么快...
不过大家大概率都是偷懒写Linq的FirstOrDefault的啦,
因为迭代器接口在C#是最多的.
只能说优化方向可以往排序+二分这方面考虑.
https://www.cnblogs.com/JJBox/p/18688118

不过...
扫描线算法上面,二分法次数是2n根扫描线,
因为要搜前一根,搜后一根,再夹选中间.
我内部还做了很多骚操作,
例如二分搜最左最右用跳两步,而不是一步...

现在感觉还是太慢了...
我来算一算:
100w数据类二分法是50ns一次.
也就是一秒只能串行执行两千万次int32的二分法.

50w条扫描线.不重叠是100w条曲线(最坏)
50ns*100w=5000w(ns)=0.05秒.
*2 = 0.1秒...
好像还能接受哦...

又不过...
double字节数多一倍...
*2 = 0.2秒...

横扫+竖扫
*2 = 0.4秒...

奇数闭合区和偶数闭合区(这一步我甚至还没有做)
*2 = 0.8秒...

未加入:
串行读取数据库时间.
求交点时间.
foreach状态机耗时.
构造代理类,访问属性和拷贝数据时间...
现在还有底边排序和中点排序两个排序能不能合并的难点.

管中窥豹都可以算到那么耗时了...
如果不用并行你能跑进五秒内已经超神了...
不用数据结构更是无稽之谈...

而且你可以看到,
为什么存在爆内存的情况,因为想要搜得快就要拷贝副本.
这个可以监控内存来实现各种降级...

不太晓得如何用SIMD来改造,
毕竟完全实现在容器和多线程下,
而且对边成组的合并居然要单线程,真的想破我脑袋了...
目前只是原理验证了,实际上还有块变换到最外层这种东西,
还有工作量!

不过...
大多数情况扫描线数还是很少的,也就万级别.
而且我们还有大杀器,制作索引.


修复:
https://www.cnblogs.com/JJBox/p/18652906
通过对颜色的处理,来判断是否能够加入.
减少了一个_set使用,并且这是原子性的.
还发现之前处理过的东西,居然忘记处理了,写到现在才想起来,

类的空参数构造,是美好的,因为它能够序列化.
初始化超级多段线时候,
可能整个组是横区或者竖区,加入其他斜组并染色+100了,
因此这种组已经没用了,要排除.
总算想起来了...
回复

使用道具 举报

发表于 2025-1-24 11:18:46 | 显示全部楼层
感觉惊惊大佬就是程序天才
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-24 16:48:58 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-1-26 16:46 编辑

真是累死狗了,
通过对颜色的处理,就可以减少hashset的使用,
但是不知道是否存在多线程问题...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-24 22:20:37 | 显示全部楼层
感觉可以用C++重构了...
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-1-25 21:46 编辑

这个功能太大了啊,感觉还得写一阵子...
存在并发的地方感觉不是很爽...
完整功能的代码量好像有点高啊,
我已经用Linq减少代码量了,
优化缓存命中这种设计都已经忘记了...
要不还是别写了...
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
你有种再说一遍 发表于 2025-1-25 16:53
这个功能太大了啊,感觉还得写一阵子...
存在并发的地方感觉不是很爽...
完整功能的代码量好像有点高啊,我 ...

加油坚持就是胜利!
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
本帖最后由 gzxl 于 2025-1-25 21:48 编辑
你有种再说一遍 发表于 2025-1-25 16:53
这个功能太大了啊,感觉还得写一阵子...
存在并发的地方感觉不是很爽...
完整功能的代码量好像有点高啊,我 ...

我见到最高效的代码:
几万行代码几乎就三个关键字 int float double,还有自己定义的struct(结构体)、最底层的api, 没有其他的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-1-26 02:13 编辑

或许组的合并不应该采用集合论操作呢?
要是能变成一个矩阵?用上SIMD才是关键啊...
难怪真的应了那句话,复杂的情况只能用复杂的方案?
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-1-30 16:30 编辑

如何把C#写成C++模样?
https://www.cnblogs.com/InCerry/ ... &order=1&desc=false

或许只能指望这种骚操作才行
1,[SkipLocalsInit] 数据不需要清零.NET5才有.
2,紧凑型布局.结构体是"干净"的,它不存储方法表,而是在CLR元数据内.
3,非托管堆申请内存,不触发STW时间.
4,利用ref不拷贝值对象数据,而是引用.
5,文章是X64测试的,在32位需要自行测试.

他居然是朝着一亿个对象做的.
学习SIMD的时候知道改成指针调用数组比Span更快.
不过这个和十亿行天文台挑战还不太一样,
居然用了非托管堆进行,显然更深入底层,

正如评论区说的,
百分之一的代码写这种,就能得到媲美C++性能,
其他部分只需要注重业务流程.
所以你可以大胆地先满足业务,再优化性能.

评分

参与人数 1明经币 +1 收起 理由
gzxl + 1 赞一个!

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-1 01:54 , Processed in 0.185883 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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