问题标签 [escape-analysis]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - 为什么切片不断从堆栈中逃逸?
我正在尝试解决 leetcode 问题排列。但是当我用 -benchmem 进行测试时,我发现它分配太多,达到 1957 年分配/操作时permute([]int{1,2,3,4,5,6})
我发现它在生成 sub-nums 目标时逃到了堆上。即使我尝试分配 [6]int,并使用 unsafe 包来构建切片,它仍然是moved to heap
。
我的问题是,为什么切片逃逸到堆,我怎么能在堆栈上分配切片?
这是我的代码:
build
没有不安全但逃逸到堆的函数:
还有我的测试用例:
当我运行时go build -gcflags="-m"
,它会报告./main.go:32:8: moved to heap: ab
go - 转义分析,将 var(s) 声明为指针
当我跑步时go build -gcflags="-m" ./...
,我得到
移动到堆:CustomStruct
但稍作改动,它就不会移动到堆中:
现在,当我运行 escape-analysis 命令时,它并没有说它CustomStruct
被移到了堆中。这里到底发生了什么?
java - 外线电话是什么意思?
我正在阅读有关 Java 中的值对象的 JEP文档,并在动机部分中遇到了这样的对象标量化上下文中的一行:
有一些优化可以消除某些代码区域中的对象分配。例如,如果可以成功执行逃逸分析,则有时可以将对象“缩放”到它们的组件字段中。然而,这样的优化在范围和适用性上是有限的。对于离线调用,对象仍然必须装箱到内存中,只要执行现有的 Java 引用语义
我从这篇文章的答案中得到了关于这里所说的优化的想法。
我无法理解的部分在 JEP 中,作者所说的外线调用是什么意思?什么可以是一个很好的例子?
简而言之,我理解 Hotspot 将展开 Object 的字段并在对象的范围不离开方法时将它们分配到方法堆栈中的事实。
什么样的代码看起来像外线调用?
go - Go - 无法对具有共享数据的不同切片标头进行转义分析
我正在做一个经常将 []int32 转换为 []byte 的项目。我创建了一个函数 intsToBytes 来执行就地转换以最小化复制。我注意到 Go 的逃逸分析没有意识到这一点ints
并bytes
引用了相同的基础数据。结果,ints
被下一个函数的堆栈数据覆盖,并继续bytes
存在并引用被覆盖的数据。
我能想到的唯一解决方案是将数据复制到一个新的字节片中。是否可以避免复制数据?