- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试了几个版本的简单谓词,该谓词从超逻辑宇宙中提取随机值并将它们放入列表中。我假设带有累加器的版本是 tail-call optimized ,因为在递归调用之后什么也没有发生,所以存在优化的路径,但它不是(它使用“全局堆栈”)。另一方面,“天真版本”显然已被优化为一个循环。这是 SWI 序言。
为什么累加器版本不受尾调用优化的影响?
这是谓词版本。
最慢,用完本地堆栈空间(预期)
在这里,我们只允许一个带有函数符号的头部来使事情变得明确。
% Slowest, and uses 4 inferences per call (+ 1 at the end of recursion).
% Uses "local stack" indicated in the "Stack limit (1.0Gb) exceeded"
% error at "Stack depth: 10,321,204":
% "Stack sizes: local: 1.0Gb, global: 7Kb, trail: 1Kb"
oracle_rands_explicit(Out,Size) :-
Size>0, !,
NewSize is Size-1,
oracle_rands_explicit(R,NewSize),
X is random_float,
Out = [X-Size|R].
oracle_rands_explicit([],0).
?- oracle_rands_explicit(X,4).
X = [0.7717053554954681-4, 0.9110187097066331-3, 0.9500246711335888-2, 0.25987829195170065-1].
?- X = 1000000, time(oracle_rands_explicit(_,X)).
% 4,000,001 inferences, 1.430 CPU in 1.459 seconds (98% CPU, 2797573 Lips)
?- X = 50000000, time(oracle_rands_explicit(_,X)).
ERROR: Stack limit (1.0Gb) exceeded
ERROR: Stack sizes: local: 1.0Gb, global: 7Kb, trail: 1Kb
ERROR: Stack depth: 10,321,204, last-call: 0%, Choice points: 6
ERROR: Possible non-terminating recursion: ...
% Same number of inferences as Slowest, i.e. 4 inferences per call
% (+ 1 at the end of recursion), but at HALF the time.
% Does not run out of stack space! Conclusion: this is tail-call-optimized.
oracle_rands_explicit_last_call(Out,Size) :-
Size>0, !,
NewSize is Size-1,
X is random_float,
Out = [X-Size|R],
oracle_rands_explicit_last_call(R,NewSize).
oracle_rands_explicit_last_call([],0).
?- oracle_rands_explicit_last_call(X,4).
X = [0.6450176209046125-4, 0.5605468429780708-3, 0.597052872950385-2, 0.14440970112076815-1].
?- X = 1000000, time(oracle_rands_explicit_last_call(_,X)).
% 4,000,001 inferences, 0.697 CPU in 0.702 seconds (99% CPU, 5739758 Lips)
?- X = 50000000, time(oracle_rands_explicit_last_call(_,X)).
% 200,000,001 inferences, 32.259 CPU in 32.464 seconds (99% CPU, 6199905 Lips)
oracle_rands_compact([X-Size|R],Size) :-
Size>0, !,
NewSize is Size-1,
X is random_float,
oracle_rands_compact(R,NewSize).
oracle_rands_compact([],0).
?- oracle_rands_compact(X,4).
X = [0.815764980826608-4, 0.6516093608470418-3, 0.03206964297092248-2, 0.376168614426895-1].
?- X = 1000000, time(oracle_rands_compact(_,X)).
% 3,000,001 inferences, 0.641 CPU in 0.650 seconds (99% CPU, 4678064 Lips)
?- X = 50000000, time(oracle_rands_compact(_,X)).
% 150,000,001 inferences, 29.526 CPU in 29.709 seconds (99% CPU, 5080312 Lips)
% Accumulator-based, 3 inferences per call (+ 1 at the end of recursion + 1 at ignition),
% but it is often faster than the compact version.
% Uses "global stack" as indicated in the "Stack limit (1.0Gb) exceeded"
% error at "Stack depth: 12,779,585":
% "Stack sizes: local: 1Kb, global: 0.9Gb, trail: 40.6Mb"
oracle_rands_acc(Out,Size) :- oracle_rands_acc(Size,[],Out).
oracle_rands_acc(Size,ThreadIn,ThreadOut) :-
Size>0, !,
NewSize is Size-1,
X is random_float,
oracle_rands_acc(NewSize,[X-Size|ThreadIn],ThreadOut).
oracle_rands_acc(0,ThreadIn,ThreadOut) :-
reverse(ThreadIn,ThreadOut).
?- oracle_rands_acc(X,4).
X = [0.7768407880604368-4, 0.03425412654687081-3, 0.6392634169514991-2, 0.8340458397587001-1].
?- X = 1000000, time(oracle_rands_acc(_,X)).
% 4,000,004 inferences, 0.798 CPU in 0.810 seconds (99% CPU, 5009599 Lips)
?- X = 50000000, time(oracle_rands_acc(_,X)).
ERROR: Stack limit (1.0Gb) exceeded
ERROR: Stack sizes: local: 1Kb, global: 0.9Gb, trail: 40.6Mb
ERROR: Stack depth: 12,779,585, last-call: 100%, Choice points: 6
ERROR: In:
ERROR: [12,779,585] user:oracle_rands_acc(37220431, [length:12,779,569], _876)
Size
参数放在第一个位置,不要使用
!
.但是
indexing is a complex matter .差异可能只会在更多条款中引起注意。
oracle_rands_compact2(Size,[X-Size|R]) :-
Size>0,
NewSize is Size-1,
X is random_float,
oracle_rands_compact2(NewSize,R).
oracle_rands_compact2(0,[]).
L
而不是匿名变量,和
L
调用后使用。
X = 10000000, time(oracle_rands_compact2(X,L)),L=[].
% 30,000,002 inferences, 6.129 CPU in 6.159 seconds (100% CPU, 4894674 Lips)
X = 10000000, time(oracle_rands_compact(L,X)),L=[].
% 30,000,001 inferences, 5.865 CPU in 5.892 seconds (100% CPU, 5115153 Lips)
oracle_rands_compact3(Size,[X-Size|R]) :-
Size>0, !,
NewSize is Size-1,
X is random_float,
oracle_rands_compact3(NewSize,R).
oracle_rands_compact3(0,[]).
?- X = 10000000, time(oracle_rands_compact3(X,L)),L=[].
% 30,000,001 inferences, 5.026 CPU in 5.061 seconds (99% CPU, 5969441 Lips)
最佳答案
这一切都取决于顶级shell和_
的实际解释。 .尝试
?- X = 50000000, time(oracle_rands_compact(L,X)),L=[].
reverse/2
.看这个用法
?- set_prolog_flag(trace_gc, true).
true.
?- X = 50000000, time(oracle_rands_compact(_,X)).
% GC: gained 0+0 in 0.001 sec; used 440+8; free 126,520+129,008
% GC: gained 0+0 in 0.000 sec; used 464+16; free 126,496+129,000
% GC: gained 0+0 in 0.000 sec; used 464+16; free 126,496+129,000
...
?- X = 50000000, time(oracle_rands_compact(L,X)),L=[].
% SHIFT: l:g:t = 0:1:0 ...l+g+t = 131072+262144+131072 (0.000 sec)
% GC: gained 0+0 in 0.002 sec; used 123,024+16; free 135,008+129,000
% SHIFT: l:g:t = 0:1:0 ...l+g+t = 131072+524288+131072 (0.000 sec)
% GC: gained 0+0 in 0.003 sec; used 257,976+24; free 262,200+128,992
% SHIFT: l:g:t = 0:0:1 ...l+g+t = 131072+524288+262144 (0.000 sec)
% SHIFT: l:g:t = 0:1:0 ...l+g+t = 131072+1048576+262144 (0.000 sec)
% GC: gained 0+0 in 0.007 sec; used 520,104+16; free 524,360+260,072
...
_compact
版本可以通过交换参数和删除剪切来加速。经典的第一个参数索引能够处理这种情况,避免任何选择点。 (SWI 具有 WAM 样式的第一个参数索引以及多个参数的较小版本,我上次检查过)
关于prolog - 天真地假设被认为是有害的 : Prolog predicate with accumulator blows (global) stack, 但天真的版本没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59757430/
以下流体模拟是对paper by Stam的翻译.真正可怕的事情发生了。每次程序以较低的 DIFF=0.01 运行时,值开始时很小,然后迅速扩大,或“膨胀”。我仔细检查了数学例程。由于代码以一个 0.
我正在编写一些代码来获得生成的线程以从 C++ 调用静态 Java 方法。 如果放置在来自 Java 的 native 调用中,调用该方法的位可以正常工作,但不能来自带有附加 JNIEnv 的线程。
我需要快速开发一个 iOS 应用程序来检测用户对麦克风的打击。这必须是一场挑战游戏,两名玩家必须依次向 iPhone 麦克风吹气。分贝值应以米或公里为单位进行测量和转换,以便我确定优胜者。 “吹得更远
众所周知,Facebook 文档并不是最好的。它内部不一致,不断变化,充满了损坏的链接,并且经常过时或完全错误。我搜索了又搜索,似乎找不到一个非常简单问题的答案:您能否获取开放图形对象实例的见解数据,
我尝试了几个版本的简单谓词,该谓词从超逻辑宇宙中提取随机值并将它们放入列表中。我假设带有累加器的版本是 tail-call optimized ,因为在递归调用之后什么也没有发生,所以存在优化的路径,
已开发的新应用程序大量使用 Web 服务。我们开始定期遇到内存不足异常(随着使用量的增加)。在查看内存转储时,我注意到有大量相同大小的 byte[]。查看这些 byte[] 的句柄,我注意到它们被 S
MPMoviePlayerController 播放器在按下完成按钮后永久隐藏播放器控件。 我有一个带有 moviePlayer.controlStyle = MPMovieControlStyleE
问题:使用有限差分迭代求解拉普拉斯方程 div2(u)=0。 边界条件:u(x,0)=1 u(x,1)=u(0,y)=u(1,y)=0 算法是: u[i,j]= 0.25 * (u[i,j-1] +
所以 Qt 在 windows 上是用/Zc:wchar_t- 编译的。这意味着 wchar_t 不是某些内部类型(我认为是 __wchar_t)的 typedef,而是 unsigned short
我尝试将 jpg-images 作为一长串图片框加载到表格布局面板中。图像列表应该可以平滑滚动,即没有闪烁或可见的模糊或抖动。大约有 300 张图片,每张图片的大小约为 150kb (600px x
在这一点上,我对高尔夫不是很熟悉,但一定有一种方法来配置错误处理。它不能总是在没有的时候就吓坏了;当你打字到一半的时候,你的SCSS,对吗?。我遗漏了什么?对此进行了研究,但似乎找不到答案。这真的很令
以下代码在 Chrome 和 Firefox 中都能正常工作。在 IE 9 中,附加选项,但文本始终为空白。 function populateDeveloperDropDownViaSkillPro
我是一名优秀的程序员,十分优秀!