我已经采取了问题#12从项目欧拉作为编程练习和我的(肯定不是最优的)实现在C,Python和Erlang和Haskell的比较.为了获得更高的执行时间,我搜索第一个三角形数字,其中有超过1000个除数而不是原始问题中所述的500.
结果如下:
C:
lorenzo@enzo:~/erlang$ gcc -lm -o euler12.bin euler12.c
lorenzo@enzo:~/erlang$ time ./euler12.bin
842161320
real 0m11.074s
user 0m11.070s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
lorenzo@enzo:~/erlang$ time ./euler12.py
842161320
real 1m16.632s
user 1m16.370s
sys 0m0.250s
Run Code Online (Sandbox Code Playgroud)
Python与PyPy:
lorenzo@enzo:~/Downloads/pypy-c-jit-43780-b590cf6de419-linux64/bin$ time ./pypy /home/lorenzo/erlang/euler12.py
842161320
real 0m13.082s
user 0m13.050s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)
二郎:
lorenzo@enzo:~/erlang$ erlc euler12.erl
lorenzo@enzo:~/erlang$ time erl -s euler12 solve
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.4 (abort with ^G)
1> 842161320
real 0m48.259s
user 0m48.070s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)
哈斯克尔: …
我被困在这两个NoSQL数据库之间.
在我的项目中,我将在数据库中创建一个数据库.例如,我需要一个创建动态表的解决方案.
因此用户可以创建包含列和行的表.我认为MongoDB或CouchDB对此都有好处,但我不确定是哪一个.我也需要高效的分页.
这个网站上已经存在很多性能问题,但是我发现几乎所有这些都是特定于问题且相当狭窄的问题.几乎所有人都重复这些建议,以避免过早优化.
我们假设:
我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法.
理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点.
我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容.
我需要在平面文件中存储多维关联数据数组以用于缓存目的.我偶尔会遇到将其转换为JSON以便在我的Web应用程序中使用的需要,但绝大多数时候我将直接在PHP中使用该数组.
将数组作为JSON或PHP序列化数组存储在此文本文件中会更有效吗?我环顾四周,似乎在最新版本的PHP(5.3)中,json_decode实际上比它更快unserialize.
我目前倾向于将数组存储为JSON,因为我觉得如果有必要,人们可以更容易地阅读它,它可以在PHP和JavaScript中轻松使用,而且从我读过的,它甚至可能是更快解码(不确定编码).
有谁知道任何陷阱?任何人都有良好的基准来展示这两种方法的性能优势?
这是一位高级经理提出的面试问题.
哪个更快?
while(1) {
// Some code
}
Run Code Online (Sandbox Code Playgroud)
要么
while(2) {
//Some code
}
Run Code Online (Sandbox Code Playgroud)
我说两者都有相同的执行速度,因为里面的表达式while应该最终评估为true或false.在这种情况下,两者都评估,true并且条件内没有额外的条件指令while.因此,两者都具有相同的执行速度,而我更喜欢(1).
但采访者自信地说:"检查你的基础知识.while(1)比快while(2)." (他没有测试我的信心)
这是真的?
在System.Linq命名空间,我们现在可以扩展我们IEnumerable的有Any()和Count() 扩展方法.
最近我被告知如果我想检查一个集合中是否包含一个或多个项目,我应该使用.Any()扩展方法而不是.Count() > 0扩展方法,因为.Count()扩展方法必须迭代所有项目.
其次,一些集合具有属性(未扩展方法),其是Count或Length.使用它们会更好吗,而不是.Any()或.Count()?
是啊/是?
与C#和Java相比,编译C++文件需要很长时间.编译C++文件所需的时间比运行普通大小的Python脚本要长得多.我目前正在使用VC++,但它与任何编译器都是一样的.为什么是这样?
我能想到的两个原因是加载头文件和运行预处理器,但这似乎不应该解释为什么它需要这么长时间.
我怎么能快速做到这一点?
当然,我可以这样做:
static bool ByteArrayCompare(byte[] a1, byte[] a2)
{
if (a1.Length != a2.Length)
return false;
for (int i=0; i<a1.Length; i++)
if (a1[i]!=a2[i])
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找BCL功能或一些经过高度优化的可靠方法来实现这一目标.
java.util.Arrays.equals((sbyte[])(Array)a1, (sbyte[])(Array)a2);
Run Code Online (Sandbox Code Playgroud)
很好地工作,但它看起来不适用于x64.
请注意我的超快速的答案在这里.
这个问题可能听起来相当简单,但这是我与另一位与我合作的开发人员的辩论.
我正在小心处理堆栈分配的东西,而不是堆分配它们.他正在跟我说话,看着我的肩膀并评论说这没有必要,因为他们的表现是明智的.
我一直认为堆栈的增长是恒定的时间,并且堆分配的性能取决于堆的当前复杂性(用于找到合适大小的孔)和解除分配(折叠孔以减少碎片,如如果我没有弄错的话,许多标准库实现在删除期间需要时间来完成此操作.
这让我觉得可能非常依赖于编译器.特别是对于这个项目,我使用Metrowerks编译器来实现PPC架构.对这种组合的洞察力将是最有帮助的,但总的来说,对于GCC和MSVC++,情况如何?堆分配不如堆栈分配高吗?没有区别吗?或者差异是如此微小,它变得毫无意义的微优化.
我经常遇到我想在我声明它的地方评估查询的情况.这通常是因为我需要多次迭代它并且计算起来很昂贵.例如:
string raw = "...";
var lines = (from l in raw.Split('\n')
let ll = l.Trim()
where !string.IsNullOrEmpty(ll)
select ll).ToList();
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,如果我不打算修改结果,那么我不妨打电话给ToArray()而不是ToList().
我想知道是否ToArray()通过第一次调用实现,ToList()因此内存效率低于仅调用ToList().
我疯了吗?我应该只是打电话ToArray()- 安全且安全地知道内存不会被分配两次吗?
performance ×10
.net ×3
arrays ×2
c ×2
c++ ×2
linq ×2
.net-3.5 ×1
c# ×1
comparison ×1
compilation ×1
couchdb ×1
erlang ×1
haskell ×1
heap ×1
j# ×1
json ×1
memory ×1
mongodb ×1
nosql ×1
optimization ×1
php ×1
python ×1
stack ×1
while-loop ×1