Tag: 性能

Java比C快吗?

到目前为止我听到的所有内容都是人们说Java通常比C慢,但有一些例外(比如涉及代码什么都不做)。 所以我出去测试它。 我有一个介于0和999,999之间的100,000个整数数组。 我在C和java(在OS X上编译)中使用了一个双循环来从最小到最大排序。 结果是Java通常在一半时间内完成。 在使用不同arrays的5次运行中,Java占用大约17秒,而C占用大约32秒(包括从文件中分配和填充arrays的时间,两者都可以忽略不计)。 那么什么会使Java代码比C运行得更快呢? 是否有我遗漏的东西,或者我听不到的一些基础技术? 编辑:也不确定它是否重要,但我使用time命令计时,而不是任何自定义代码。 例如: $time java SortArray 至于编译器选项,我现在无法访问该命令行,但它是OS X 10.10上的默认gcc选项: gcc sortarray.c -o sortarray 我只是使用默认的javac来编译Java。 javac SortArray.java C: #include #include #define SIZE 32 int main() { FILE* file = fopen(“bigarray.txt”, “r”); int arraySize = 100000; int array[100000] = {}; int i, j, temp; char inputBuffer[SIZE]; for (i = […]

在什么阶段if / else变得比switch案更好? 可以?

根据我的阅读,我可以总结一下, Switch case是实现定义的,但主要定义为跳转表 Switch case使代码更具可读性 切换比if/elseif (?)快 考虑一下我有300多个开关盒的情况。 我知道这个场景中的if/elseif会很乱。 但我想知道switch盒在这样的场景中会如何表现? 它是否具有可扩展性,即无论存在多少个案例,它仍然比if / else更快? 由于它是实现定义的,我如何弄清楚我的编译器是如何实现它的? 最重要的是, if/elseif我该怎么做 – 除了实际编写代码和使用分析器之外还要进行比较? 我尝试使用gcc 4.8.1 -S开关编译一个带开关盒的小.c文件,它看起来像是一个跳转表。我从哪里开始? 在这种情况下使用if/elseif更好/更糟吗? 我主要对C / C ++的具体细节感兴趣

将未排序的连续字符串数组有效地排序到文件中

我有一个包含无序连续数字的字符串数组(范围从0到n),例如[7a, 1b, 2c, 0d, 6e, 5f, 3g, 4h] ,我想将数字按顺序写入文件。 例如: 0d 1b 2c 3g 4h 5f 6e 7a 字符串的长度不尽相同。 我试图找到一种方法,既快速又无需占用太多​​空间。 我找到了一种方法,我可以在O(n)空间复杂度和O(n)性能中做到这一点:我创建一个包含n个单元格的数组,并将每个字符串插入到他的单元格编号中。 for (i = 0; i < n; i++) sortedArray[originalArray[i]] = originalArray[i] …类似的东西(创建原始大小的新数组并在一次运行中填充),然后与另一个for循环将已排序数组的内容写入文件。 但我正在寻找一种更好的方法来做到这一点。

任意精度分数算术中的浮点数与有理数(C / C ++)

由于实现AP分数的方法有两种,一种是模拟double数据类型的存储和行为,只有更多的字节,另一种是使用现有的整数APA实现来表示分数作为理性即作为一对整数,分子和分母,这两种方式中的哪一种更有可能在性能方面提供有效的算术? (内存使用率确实很小。) 我知道现有的C / C ++库,其中一些提供带有“浮点数”的小数APA,另一些提供有理数的(不过它们都没有定点APA,但是当然我可以对依赖于“的库进行基准测试”浮动“对使用合理实现的实现进行实现,但结果很大程度上取决于我必须从近十个可用库中随机选择的那些特定库的实现细节。 因此,我感兴趣的两种方法的理论优缺点(或者如果考虑定点APA则为三种)。

为短代码获得可靠的性能测量

我正在尝试分析一些函数,这些函数以不同的方式实现相同算法的不同版本。 我增加了每个函数运行的次数,这样在单个函数中花费的总时间大约是1分钟(以揭示性能差异)。 现在,运行几次测试会产生令人困惑的结果。 在同一函数的多次执行之间存在巨大的可变性(+ – 50%),并且因此确定哪个函数最快(这是测试的目标)几乎是不可能的。 在运行测试之前,我应该注意一些特殊的事情吗?这样我可以获得更平滑的测量结果吗? 如果不这样做,是多次运行测试并计算每个函数的平均值?

计算浮点数的位数

是否有任何有效的方法(不将float转换为字符串)以获得浮点数组成的位数(与其长度和精度无关)? 通过这种方式,我可以通过将float乘以它所包含的位数来实现一个相当好的,可移植的,无问题的函数来进行比较/调节。

C中每N个元素中最常见的

我有一个大的数组A,大小为[0,8388608]的“相对较小”的整数A [i] = [0,131072],我想找到每个N = 32个元素中最常出现的元素。 什么会更快, A.创建一个大小为131072的关联数组B,迭代32个元素,递增B [A [i]],然后迭代B,找到最大值,将B中的所有元素重置为0,重复| A | / 32次。 B. qsort每32个元素,找到A [i] == A [i-1]的最大范围(因此也是最常见的元素),重复| A | / 32次。 (编辑)C。别的。

快速实现大整数计数器(在C / C ++中)

我的目标如下, 生成连续值,以便之前从未生成每个新值,直到生成所有可能的值。 此时,计数器再次启动相同的序列。 这里的要点是, 所有可能的值都是在不重复的情况下生成的(直到周期耗尽)。 如果序列是简单的0,1,2,3 ……,或者以其他顺序,则无关紧要。 例如,如果范围可以简单地用unsigned表示,那么 void increment (unsigned &n) {++n;} 足够。 但是,整数范围大于64位。 例如,在一个地方,我需要生成256位序列。 一个简单的实现如下,只是为了说明我想要做的事情, typedef std::array ctr_type; static constexpr uint64_t max = ~((uint64_t) 0); void increment (ctr_type &ctr) { if (ctr[0] < max) {++ctr[0]; return;} if (ctr[1] < max) {++ctr[1]; return;} if (ctr[2] < max) {++ctr[2]; return;} if (ctr[3] < max) {++ctr[3]; […]

这种乘法算法的时间复杂度是多少?

对于经典的访谈问题“如何在没有乘法运算符的情况下执行整数乘法?”,最简单的答案当然是C中的以下线性时间算法: int mult(int multiplicand, int multiplier) { for (int i = 1; i < multiplier; i++) { multiplicand += multiplicand; } return multiplicand; } 当然,有一个更快的算法。 如果我们利用向左移位的属性相当于将2乘以移位的位数的幂,我们可以向上移位到最接近的2的幂,并使用我们之前的算法加起来从那里。 所以,我们的代码现在看起来像这样: #include int log2( double n ) { return log(n) / log(2); } int mult(int multiplicand, int multiplier) { int nearest_power = 2 ^ (floor(log2(multiplier))); multiplicand << nearest_power; for […]

实现BlackList的最有效方法

我正在开发一个Ipfilter并猜测我如何使用任何类型的esque数据结构,开发出非常高效和快速的BlackListfilter。 我想要做的是简单,每个传入/传出连接我必须检查被阻止的IP列表。 IP是分散的,内存使用应该是线性的(不依赖于阻塞列表的数量,因为我想在有限的系统(自制路由器)上使用)。 我有时间,可以从零创建任何东西。 困难对我来说并不重要。 如果你可以使用任何东西,你应该怎么做?