duangsuse::Echo
714 subscribers
4.24K photos
127 videos
583 files
6.46K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from yihong0618 和朋友们的频道 ()
好像大多数人都忘了 cursor 20 刀一个月是 copilot 的两倍。
#os #rust struct/union不能实现的短字符串(16byte)优化?
https://duanmeng.github.io/2023/12/14/umbra/#:~:text=包含12个或更少字符的短字符串直接存储在字符串头部的剩余12个字节中,从而避免了昂贵的指针间接寻址
https://nan01ab.github.io/2020/12/Umbra.html

可以类比 x32 ABI (指针范围压缩为4GB, 因为大部分单线程不会超过这个数, 就像 int 在x64和x86默认宽度相同)
https://lantian.pub/article/modify-website/x32-abi-docker-containers.lantian/ #dalao

同样,在JDK8+ 默认开启有对象头压缩 -XX:+PrintCompressedOopsMode , 指针压缩后,并不是所有引用都保存在堆中,而是以8个字节为间隔保存引用。
装箱的Int@List.. 即占用 16bytes=64(Mark Word,主要是hashcode)+32(Compressed oops)+32(int)=128bits

CBOR.me 的 cborseq 选项,可以可视化这样的位运算压缩,不过,unaligned read 在一些CPU架构上会报错
#game https://www.youtube.com/watch?v=nh7KfuJqp54

🥰 #bilibili 上的小将还说外国人看不懂…… 唉,缺少文化自信
#acg #bilibili https://www.youtube.com/watch?v=mLW35YMzELE 🤔 #recommend
肌肉魔法师马修 有趣的宗教国龙傲天故事
奇奇怪怪的BGM意外得到2亿次播放呢?

「制度之间没有绝对的优劣,却有相对的文明」
不让女性上学的宗教国,不如信仰自由的世俗国。 这是说,文化间存在优胜劣汰,是「崇洋媚外」吗?
——不是!因为欧美日韩台也有宗教!只是强迫人民信仰的救赎,和个体的relief,是种同名反义词

幸运的是,马修代表了魔法世界里警察部门无法承认的,最强的力量
马修最终的胜利,不代表魔法师都完蛋了,而是为更加广泛的新兴职业提供存在的可能。
duangsuse::Echo
#os #rust struct/union不能实现的短字符串(16byte)优化? https://duanmeng.github.io/2023/12/14/umbra/#:~:text=包含12个或更少字符的短字符串直接存储在字符串头部的剩余12个字节中,从而避免了昂贵的指针间接寻址 https://nan01ab.github.io/2020/12/Umbra.html 可以类比 x32 ABI (指针范围压缩为4GB, 因为大部分单线程不会超过这个数, 就像 int 在x64和x86默认宽度相同)…
#rust #go #algorithm UmbraString 是对带长度指针(py.bytes, rs.slice) 的(免链接inline),而 SwissTable 是对Hash预分组查表的免链接!

我们知道,Java 存在(装箱boxing) 一说,也就是int,char等字面值的堆分配 (这是泛型擦除 vs template<>化新建的编译期细节),因此JDK8用class Stream.OfInt{}缓解了reified泛型的缺失

那么,(拆箱unwrap) 其实就是在值的内存上内联,像C++栈分配。 除了禁止null,拆箱在运行时有省内存GC、免链接、CPU快取等好处

这么好的算法升级,实现难吗?
map采用预分组查表,哈希值冲突(哈希值一样)的键值对会被放在一个桶中,查找桶=hash(key) mod size,然后再遍历桶中Eq的元素,这里有通过额外的bit做更快的检查。 #dalao https://gufeijun.com/post/map/1/

一旦map的负载因子(键值对个数与桶个数比值)过大,查找需要线性遍历多个桶,性能会退化为O(n),所以这种实现需要更频繁地对桶进行扩容,保持负载因子在低水平。
拉链法是大多数编程语言的选择,每个桶后面跟上一个链表,所有的同义词通过链表中节点形式串联

SwissTable 使用一种称为Closed Hashing的方案。每一个哈希值都会有一个自己的槽位(slot),槽的选择是由哈希值决定,从hash(key) mod size的槽开始查找,一直往后查找到空的槽(null)
SwissTable也是和内建的map一样采用短哈希(8b hash),以便支持快速检查,但是它的元数据却是独立存储的,和哈希值存储分开。

把hash值分为高7位和低57位:
高7位用在control byte中解决hash冲突 (这7位只是以很低的代价,减少了90%键与键的比较。)

低57位是slot的指针,每个slot对应一个1一个byte的控制字节。

Control byte的高1位用于表示状态 0xFF=undef, 0x80=null值 ,低7位用于存储hashcode的高7位
128bit对齐的连续8字节的control byte称为一个group

使用这种方式,可以通过SIMD 指令并行比较 16 个短哈希,比 std::unord_set 快两倍 (map只是K:V元组按K搜的set)
Flat hashtable不仅仅只是CPU CACHE友好,这样的结构配合原子操作,相信很容易做出一个并发版本的hash table
duangsuse::Echo pinned «#反直觉 的 #经济 :节省越多,财富越停滞;资本家越少,国民越接近非酋? 这就是通缩危机:存钱-不消费-倒闭-削价竞争-你被降本增笑-更难存钱.. 😊 等倒闭的足够多,价格内卷就会换成恶性通胀 (简称国家滞胀)。 这样,之前辛苦劳动的棺材本,就要「清零」了!! 因此,政府那么急于靠调休逼购打破通缩螺旋。印钞,其实就是国在借,到期国家不还你钱,就只能换你国家了。 正所谓:资本亡我之心不死啊!韭菜敢争,主权会乱 > 这类流通性危机(即储蓄不花等人借),其实是供销自我平衡的过程,而外贸(输出"技术"革命)能缓解这些波动。…»
Forwarded from Rachel 碎碎念 (Rachel 🐨)
#有意思的文章
茶颜悦色独有的、接地气的人文关怀,我喜欢这个品牌的原因

当时看到这篇文章就很有感触,在长沙这座不夜城,隐藏在闹市背后的清洁工们,的确值得更多的关注与善意

中秋回长沙,点一杯鸳央咖啡,碰巧发现了他们在文章里提到的明信片,于是又想起来这篇文章;环卫工人们日复一日的坚守,也值得被更多人看到:

《那些帮茶颜收尾的人》
https://mp.weixin.qq.com/s/kFULADCn2bQgG3TTAoAJUw
👍2
Forwarded from Dante's Limbo (Dante At2814)
duangsuse::Echo
#rust #go #algorithm UmbraString 是对带长度指针(py.bytes, rs.slice) 的(免链接inline),而 SwissTable 是对Hash预分组查表的免链接! 我们知道,Java 存在(装箱boxing) 一说,也就是int,char等字面值的堆分配 (这是泛型擦除 vs template<>化新建的编译期细节),因此JDK8用class Stream.OfInt{}缓解了reified泛型的缺失 那么,(拆箱unwrap) 其实就是在值的内存上内联,像C++栈分配。…
#algorithm #防自学 🤓 让我来示范一下怎么概括算法思路
要介绍的是在stdlib里,用于组织集合类、JSON的3个重要结构: b"ytesPtr", {K:V}, sorted([0 2 1])=[0 1 2]
它们对各种app和其他算法性能效能的重要性,好比json(cbor.me)之于REST、zip之于jvm和pip。 因为是涉及SDK实现的内容,也主观评价下语法设计

下面用胖指针(x64上void*是8b, 胖指16b)、链表、快速排序简单的实现3者 #code
#define Col(...) typedef struct{__VA_ARGS__;} T;

#define T Str
Col(size_t n; char* buf) //C的类型本应默认为指针, *胖指针,像kt那样对Int等类型免链接化。简洁的UNIX里,Type* 快成为public那样的形式主义啦

#define T_Link(E,T) struct T{E x; T* xs;}
T_Link(int,Nums) //template<T> 允许类型推理,即一致化调用和返回处的<T>。可怜gcc/clang无论对宏还是模板的报错皆如内容农场,不具有可读性

https://colobu.com/2023/06/29/replace-std-map-faster/chunk-index-memory.jpg
用例和 #haskell #code https://gist.github.com/duangsuse/26b80c39e1d8f7549b9cf244d8de1ce4
题外话,闭包值和 x.interface_cast(T) 的双指针&dyn 随结构传入T的函数表
qsort :: (Ord a) => [a] -> [a]
qsort [] = []
qsort (x:xs) =
let smallerSorted = qsort [a | a <- xs, a <= x]
largerSorted = qsort [a | a <- xs, a > x]
in smallerSorted ++ [x] ++ largerSorted


UmbraString 和上文Str{n,buf}胖指针一样是16b,但它的.n和jvm一样只寻址[4b:int]的长度,其后最少随4b的免链接char 用于比大小
对于n>12的buf,剩下8b换成指针,指针的高2位用于标记GC信息: 持久pin、临时ref、用后即焚val

很明显!这是一种灵活利用了x86内存布局的b"length"实现,和x32压缩指针一样,节省了sort解指针的时间

SwissTable 是对Hash预分组查表的免链接。我们知道, dict/HashMap/lua.Table 这样的{K:V, K1:V} 单映射常被用于查找和缓存,在C++里更是会区分 unordered_map, rb_map(以排序radix,SortedSet,而非hash作为预分组线索)
它的最简实现是lisp里的链表 T_Link(struct {int A,B;}, int_LnKV) :没留任何线索来减枝!

即便8b hashCode,也是一定会冲突的,哪怕是int.hash也会因 buck[hash%nBuck] 有限而退化为线性查找,负载因子(kv/nBuck 过大),这时就要扩容。Go的扩容基于一种空间换时间的优化(图1, 为了减少求余数的冲突,除数都会采用2的指数)
扩容后的冲突集,可以用链表(UnionFind)或数组(slot), 从那往右找
Swiss 更聪明,它对每slot对应1b的元数据,最高位0x80=无效项 ,0xFF=null结尾 ,低7位用于存储hashcode的高7位,这么摘要是为了SIMD128bit 1次对比8个KV
不仅仅只是CPU CACHE友好,这样的结构配合原子操作,相信很容易做出一个并发版本的hash table

快速求余(x,n)= uint32((uint64(x) * uint64(n)) >> 32)
#dalao https://init.blog/fast-newton-sqrt/
float InvSqrt(float x) {
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i >> 1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}


最近的一种基于partition(区间而非idx)的快排也很有趣: less than pivotL | between pivotL and pivotR | greater than pivotR
#dalao https://t.me/hyi0618/4123
今天看到 Eric Zhang 的简历令我震惊 https://www.ekzhang.com/resume

学术上:
在哈佛读 A.B. in Computer Science and Mathematics 和 S.M. in Computer Science 双硕士学位,以优异成绩毕业,获得该领域最高荣誉
参与教学,并获得多个教学证书;各种研究均有论文发表。

工作上:
创业公司 Modal 的创始人之一。在多家硅谷科技公司公司工作过,包括 Nvidia 的实习经历。工作所使用的语言包括 C++, Rust, Python, Go, JavaScript (Svelte)。从底层基础设施到上层应用构建都有涉及。

开源上:
有多个热门开源项目,包括 sshx (5000 stars), Bore (8000 stars), Rustpad (3000 stars), Graphics Workshop (2000 stars), 还有十来个几百 stars 的项目。这些项目都有很好的代码质量,和 UI 上的克制审美。
https://www.ekzhang.com/graphics-workshop/ #glsl

Eric Zhang 真的颠覆了我的认知,第一次见到这般学术极其优异又开发能力很强,还非常年轻的人。除了佩服还是佩服,甚至没有任何对比和忌妒的想法,这样的人的存在就像火炬一样,让我保持自己的要求,坚定自己的追求,始终学习和进步。
#china #经济 #science
光刻机lithography #facts

- 制裁前最先进的制程是2019年荷兰的28nm(智能电器),通过「多重曝光/套刻」拿成本换精度可以达到7nm(手机),但和GFW一样,掩耳盗铃罢了。去掉那些制度自信 没人氪金,走不出去
- 2024年底墙内吹风的7nm,实际上良品率达标(性价比与墙外能有一战之力的)是65nm,略输于欧美日韩台支持下 ASML.com 2006 的工艺

- 墙内对技术基建的过度关注是 *不正常* 的,真正参与相关产业链的国家,是不会整「且听龙吟 提头来见」、调急停按钮、弯道翻车的烂活😅
- 不要把2nm 7nm 这些当成分数来内卷,现阶段7nm够用。但问「自主生产 一种全人类最先进工艺的融合 要不惜多大代价」,只能说这是一个很弱智的问题。人定胜天呗

https://m.youtube.com/watch?v=5RMa1EOTbQQ
https://m.youtube.com/watch?v=W82om-FDmW4
- 视频中手作5000nm 芯片Z1 时飞线的封装技术是"COB",用于在低密度铜蚀刻IC上集成电路,俗称牛屎芯片;是禁插拔版LGA (PGA的免针脚板),PCI 接口定义,还不是核心技术
- 光刻精度,RISCV 也只是一种「可以量化」的噱头。留岛不留人,缺了🇹🇼人也造不出芯片,就算把日本荷兰也梧桐了,你卖芯片给谁呢?月薪3k的中国台湾人? 诶,像它鹅爹
- 拥有再大的国土,却靠卡脖子盖主子把天才鬼才变成奴才,恐要重蹈地大物博的覆辙,被一叶小岛并吞了🇯🇵
- 在“中国大陆”努力超英赶美打麻雀的年代,鬼岛已经“改革开放”,在硅谷成立 NVidia, AMD, Asus 和 tsmc台积电,Realtek瑞昱,MTK联发科,allwinner全志 等企业了。康师傅、统一、旺旺 也都来自台湾。若论且听龙吟,是大陆被台湾文统了!🌚

顺序要搞清楚:因为文统技不如人,一怒之下想掀棋盘五筒,得不到就毁掉,是谓霸权主义,活该被制裁。

Leonard: 哎,明明可以深化改革搞好外交,融入自由贸易的普世价值,就可以继续走向发展正道
偏偏摸着石头过河,不惜一切代价。一叶障目,聪明反被聪明误啊
duangsuse::Echo
#反直觉 的 #经济 :节省越多,财富越停滞;资本家越少,国民越接近非酋? 这就是通缩危机:存钱-不消费-倒闭-削价竞争-你被降本增笑-更难存钱.. 😊 等倒闭的足够多,价格内卷就会换成恶性通胀 (简称国家滞胀)。 这样,之前辛苦劳动的棺材本,就要「清零」了!! 因此,政府那么急于靠调休逼购打破通缩螺旋。印钞,其实就是国在借,到期国家不还你钱,就只能换你国家了。 正所谓:资本亡我之心不死啊!韭菜敢争,主权会乱 > 这类流通性危机(即储蓄不花等人借),其实是供销自我平衡的过程,而外贸(输出"技术"革命)能缓解这些波动。…
#谈政史 王朝周期律,如何唯独让曾经富饶的南美洲「拉美化」
缺少金矿和土产资源,竟然也是「塞翁失马焉知非福」?

https://m.youtube.com/watch?v=MHbzQjvVBgs&t=9m
https://m.youtube.com/watch?v=cBKxIfoQN5M

>狐狸对鸡说,你每个月给我几个鸡蛋,我给你存着,等你老了不能下蛋了,我再按月返给你。
于是整个村的鸡,每个月给狐狸交蛋,狐狸吃些,再送给亲戚朋友些,再卖一些,日子过得挺舒服。
后来,鸡老了,去找狐狸要蛋,狐狸又喝了一锅老母鸡汤,非洲兄弟也有喝到
笑点解析: 母鸡下蛋本是为了孵小鸡,就像某厂做手机本是为了服务消费者。
養活了一趙家人,最後還變成雞湯讓大家暖心😊

翠财经:如何从根本解决养老金不够发 #经济
- 目前,社保覆盖了个人所得税不好收、刚需割不到的部分,要解决经济问题,必须恢复公信力
- 并轨。让拿着立法权的牧羊犬把自己的待遇砍1万7,1万给两脚羊;体制内按时退休,让坑给年轻人上岸
- 给诞崽派对爆金币,可以学习西班牙的1胎贷款5胎免除
- 把经济搞起来,让年轻人愿意交保,这就更不切实际了,因为屠龙勇士自己成了最大的既得利益者

总结:财政和通缩一石二鸟,就是要苦一下政府😅,牺牲你一个 救活。。
不过金科绿玉的教科书说过,「只有」我党才能救中国