Dan*_*iel 0 c c++ performance benchmarking
在您阅读我的帖子之前,请考虑到我是C和C++的新手.我主要是托管代码开发人员.
我有两段相同的代码(或者至少我相信).一个用C语言,一个用C++语言.代码基本上检查数字是否为素数,如果是,则将其存储在容器中.
C++
Main.cpp的
#include <iostream>
#include <vector>
#include <time.h>
static bool isPrime(const int& number) {
if((number & 1) == 0) {
if(number == 2)
return true;
else
return false;
}
for(int i = 3; (i * i) <= number; i++) {
if((number % i) == 0)
return false;
}
return number != 1;
}
int main(int argc, const char * argv[]) {
std::vector<int> vector;
clock_t start = clock();
for(int i = 0; i < 30000000; i++) {
if(isPrime(i))
vector.push_back(i);
}
clock_t end = clock();
clock_t seconds = (end - start) / CLOCKS_PER_SEC;
std::cout << "done after " << seconds << " seconds " << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C
Vector.c
#include <stdlib.h>
typedef struct vector_class {
void(*push_back)(struct vector_class *vector_instance, const int *data);
int *data;
int length;
int capacity;
} vector;
static void push_back(vector *vector_instance, const int *data) {
if(vector_instance->length >= vector_instance->capacity) {
vector_instance->capacity *= 2;
vector_instance->data = (int*) realloc(vector_instance->data, sizeof(int) * vector_instance->capacity);
}
vector_instance->data[vector_instance->length] = *data;
vector_instance->length++;
}
static void vector_constructor(vector *vector_instance) {
vector_instance->push_back = &push_back;
vector_instance->length = 0;
vector_instance->capacity = 2;
vector_instance->data = (int*)malloc(sizeof(*vector_instance->data) * vector_instance->capacity);
}
static void vector_destructor(vector *vector_instance) {
free(vector_instance->data);
vector_instance->length = 0;
vector_instance->capacity = 0;
vector_instance->data = NULL;
}
Run Code Online (Sandbox Code Playgroud)
MAIN.C
#include <stdio.h>
#include "vector.c"
#include <time.h>
static int isPrime (const int *number) {
if((*number & 1) == 0) {
if(*number == 2)
return 1;
else
return 0;
}
for(int i = 3; (i * i) <= *number; i += 2) {
if((*number % i) == 0)
return 0;
}
return *number != 1;
}
int main(int argc, const char * argv[]) {
vector v;
vector_constructor(&v);
clock_t start = clock();
for(int i = 0; i <= 30000000; i++) {
if(isPrime(&i))
v.push_back(&v, &i);
}
clock_t end = clock();
clock_t seconds = (end - start) / CLOCKS_PER_SEC;
printf("%lu seconds \n", seconds);
for(int i = 0; i < v.length; i++) {
//printf("%d \n", v.data[i]);
}
vector_destructor(&v);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用内置的Clang编译器在我的OS X Mavericks上编译这两个程序.
C++
g++ -O3 -std=c++11 Main.cpp
Run Code Online (Sandbox Code Playgroud)
C
gcc -O3 -std=c99 Main.c
Run Code Online (Sandbox Code Playgroud)
两者都编译无故障,并且它们也无故障运行.然而..
我得到不同的时间结果.
C在12秒后结束
C++在26秒后完成
谁能指出我做错了什么?谢谢!
你的节目略有不同isPrime
.在您的C++程序中:
for(int i = 3; (i * i) <= number; i++) {
Run Code Online (Sandbox Code Playgroud)
在你的C程序中:
for(int i = 3; (i * i) <= *number; i += 2) {
Run Code Online (Sandbox Code Playgroud)
因此,您的C++程序计算余数大约是C程序的两倍,这可能解释了您的性能差异.
除此之外,我建议你不要通过int
引用或指针传递,除非你有充分的理由.希望编译器足够聪明,可以弄清楚你不需要并优化它,但谁知道呢?
此外,您希望尽可能避免通过函数指针调用函数,就像在C程序中一样.它们通常会损害编译器内联优化函数的能力.这可能是这样的情况,编译器足够聪明,无论如何都可以内联调用,但是谁又知道呢?
最后,如果计算所有小于N的质数实际上就是你所追求的并且这不是一个用来衡量C与C++的玩具的玩具,那么请看看Eratosthenes的Sieve或者Sundaram的Sieve.或者,您可以将已知素数的向量传递到isPrime
并仅检查已知的素数而不是所有奇数.
归档时间: |
|
查看次数: |
182 次 |
最近记录: |