我今天接受了一次面试,我们得到了编程问题,并被要求使用c / c ++ / Java解决它,我在java中解决了它,它的运行时间为3秒(测试更多是16000行,并且陪我们的人说运行时间合理),另一个人用c解决了它,运行时间是0.25秒,所以我想知道,是12正常因素吗?
编辑: 正如我所说的,我认为算法变化的空间不大,除非是在一件小事上,无论如何,我们必须实现这个协议: A(客户端)和B(服务器)根据某些协议p进行通信,在传递消息之前检查其有效性,协议由其状态和可以在特定状态下发送的文本消息定义,所有状态只有一个可以发送的有效消息,除了一个状态,其中有10个消息可以发送,有5个状态,状态转换也由协议定义。 所以我对可以发送10个不同消息的状态所做的是将它们的字符串值存储在ArrayList容器中,然后当我需要检查相应状态中的消息有效性时,我检查了是否为arrayList.contains(sentMessageStr);我认为这个操作的复杂性是O(n)虽然我认为java有一些内置的优化操作,虽然现在我正在考虑它,也许我应该使用HashSet容器。我想c实现本来可以将这些预定义的合法字符串按字典顺序存储在数组中并实现二进制搜索功能。
感谢
答案 0 :(得分:5)
我猜想jvm很可能只花了3秒才加载。尝试连续5次在同一台机器上运行java版本。或者尝试在数据集上同时运行500倍。我怀疑你会发现Java版本有一个显着的持续延迟,当运行时间进入分钟时,它将变得微不足道。
答案 1 :(得分:3)
听起来更像是样本不足和实施不平等的情况(可能是不相等的试验台)。
测量的第一个规则之一是建立足够的样本并获得样本的平均值以进行比较。即使是同一个程序的几次运行也是不够的。您需要对机器征税足以获得可以比较其值的样本。这就是为什么测试床需要预热,以便除了观察系统外几乎没有变量在起作用。
当然,您也有不同的人以不同的方式实施相同的要求/算法。重要的是。期。除非算法实现已经“标准化”,否则获取样本并比较它们与比较苹果和西瓜相同。
我认为我不需要扩展测试平台可能具有不同配置或不同负载的事实。
答案 2 :(得分:2)
在没有看到代码的情况下几乎不可能说 - 你可能有一个更好的算法,例如对于更大的输入可以更好地扩展,但对于小输入大小则有更大的开销。
话虽如此,如果您使用“更高级别”构造(如ArrayLists / boxed对象)对解决方案进行编码,并且C解决方案基本上使用优化的低级指针算法,这种12x差异大致是我所期望的。预先分配的内存区域。
我宁愿维持更高级别的解决方案,但有时候只有手动优化的低级代码才能做到.....
另一个可能的解释是,JIT尚未对您的代码进行预热。通常,在您看到JIT编译代码中的最佳性能之前,您需要达到“稳定状态”(通常是每个代码路径的几千次迭代)。
答案 3 :(得分:1)
性能取决于实施。如果不确切知道你的代码是什么以及你的竞争对手做了什么,就很难确切地说出发生了什么。
但是,让我们说isntance,你使用像矢量或其他任何东西来解决问题而C家伙使用数组[],他的实现肯定会比你的更快。
C代码可以非常有效地转换为汇编指令,而另一方面,Java依赖于一堆东西(如JVM),这些东西可能会使程序的字节码变得更胖并且可能会慢一点。
答案 4 :(得分:1)
你很难找到能在Java中比在C中执行得更快的东西。确实,一个数量级是一个很大的差异,但一般来说C的性能更高。
另一方面,您可以更快地在Java中生成任何给定问题的解决方案(特别是考虑到库的丰富性)。
因此,在一天结束时,如果有一个选择,它就会成为性能和生产力之间的两难选择。
答案 5 :(得分:0)
这取决于算法。 Java当然通常比C / C ++慢,因为它是一个虚拟机,但对于大多数常见应用程序来说,它的速度已经足够了。对于常见的应用程序,我不会称之为正常因子。
如果您发布C和Java代码进行比较,那就太好了。
答案 6 :(得分:0)
因子12可以是正常的。因此可能是1或1/2的因素。正如一些评论员提到的那样,很多都与您编写解决方案的方式有关。
不要忘记java程序必须在jvm中运行(除非你编译为本机机器代码),所以任何基准测试都应该考虑到这一点。
你可以谷歌搜索“java和c速度比较”进行一些分析
答案 7 :(得分:0)
实施中使用的算法很可能是不同的。
例如(过度简化)如果你想添加一个N,M次,一个实现可能是:
long addTimes( long n, long m ) {
long r = 0;
long i;
for( i = 0; i < m ; i++ ) {
r += n;
}
return r;
}
另一个实现可能只是:
long addTimes( long n, long m ) {
return n * m;
}
两者都将在Java和C中运行大致相同(你甚至不需要更改代码),但是,一个实现的运行速度会比另一个快得多。
答案 8 :(得分:0)
回到那些日子我会说你的Java代码慢了12倍没什么不对。但是现在我宁愿说C家伙更有效地实现了它。显然我可能错了,但你确定你使用了正确的数据结构并且编码得很好吗?
你也测量了内存使用量吗?这可能听起来很愚蠢,但去年在大学我们遇到了编程挑战,不记得它是什么,但我们不得不用我们想要的任何语言解决图形问题 - 我用C语言做了两个算法实现一个在Java中,Java的速度慢了1.5-2倍,但是我知道我不必担心内存管理(我确切地知道输入有多大以及将运行多少测试样本老师)所以我根本没有释放任何内存(在一个程序中花了太多时间在一个~15k节点的图形上运行~1-2秒,或者它是150k?)所以我的Java代码是更好的内存明智但速度较慢。我也用C语言自己解析了输入(在Java中没有这样做)这真的让我节省了很多时间(大约20-25%的提升,我自己也很惊讶)。我会说1,5-2x比12x更逼真。