为什么C样式代码比C ++样式代码更快[关闭]

问题描述 投票:-7回答:1

在C ++中实现算法问题后,我很好奇并用C语言编写。

我意识到C实现本身有很多代码和很多杂乱和不必要的部分。

对于C ++实现,速度为8ms,C为0ms。

我在C中实现的代码长度较长,但大小只有C ++文件的一半。

我很好奇有什么样的差别。请告诉我

C代码

#include <stddef.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LENGTH 1000
char *iterator;

bool assertNotNull(char* input) {
    bool ret = true;

    if (input == NULL)
        ret = false;

    return ret;
}

char *reverse(char *input) {
    char head = *(input);
    char *ret = (char*)malloc(sizeof(char)*MAX_LENGTH);
    memset(ret, '\0', 1);

    if (head == 'w' || head == 'b') {
        char str[2] = { head , '\0' };
        memcpy(ret, str, 2);
    }

    else {
        char *leftTop = reverse(++iterator);
        char *rightTop = reverse(++iterator);
        char *leftBot = reverse(++iterator);
        char *rightBot = reverse(++iterator);

        char str[2] = { 'x','\0' };
        memcpy(ret + strlen(ret), str, 2);
        memcpy(ret + strlen(ret), leftBot, strlen(leftBot)+1);
        memcpy(ret + strlen(ret), rightBot, strlen(rightBot)+1);
        memcpy(ret + strlen(ret), leftTop, strlen(leftTop)+1);
        memcpy(ret + strlen(ret), rightTop, strlen(rightTop)+1);

        free(leftTop);
        free(leftBot);
        free(rightTop);
        free(rightBot);
    }

    return ret;
}

int main() {
    int caseNum;
    char *input = (char*)malloc(sizeof(char)*(MAX_LENGTH));
    char **ret = (char**)malloc(sizeof(char*)*MAX_LENGTH);

    scanf("%d", &caseNum);

    for (int i = 0; i < caseNum; i++) {
        scanf("%s", input);
        iterator = input;
        *(ret + i) = (char*)malloc(strlen(input) + 1);
        *(ret + i) = reverse(input);
    }

    for (int i = 0; i < caseNum; i++) {
        printf("%s\n", *(ret + i));
    }


    return 0;
}

C ++代码

#include <string>
#include <iostream>
#include <vector>
using namespace std;

string reverse(string::iterator &it) {
    char head = *(it);
    string ret = "";

    if (head == 'w' || head == 'b') {
        ret += head;
    }

    else {
        string leftTop = reverse(++it);
        string rightTop = reverse(++it);
        string leftBot = reverse(++it);
        string rightBot = reverse(++it);

        ret += 'x' + leftBot + rightBot + leftTop + rightTop;
    }

    return ret;
}

int main() {
    int caseNum;
    string input;
    vector<string> ret;

    cin >> caseNum;

    for (int i = 0; i < caseNum; i++) {
        cin >> input;
        string::iterator it = input.begin();
        ret.push_back(reverse(it));
    }

    for (int i = 0; i < caseNum; i++) {
        cout << ret[i] << endl;
    }

    return 0;
}

///

这是四叉树翻转的算法问题。 (https://algospot.com/judge/problem/read/QUADTREE

示例输入是

4 // counts of case
w
xbwwb
xbwxwbbwb
xxwwwbxwxwbbbwwxxxwwbbbwwwwbb

示例输出是

w
xwbbw
xxbwwbbbw
xxwbxwwxbbwwbwbxwbwwxwwwxbbwb

和C代码性能时间:0ms C ++代码性能时间:8ms这个时间是从算法问题站点(algospot)计算出来的。

我非常感谢所有的答案,并让我意识到我的问题是错的!

(我为笨拙的英语道歉。:))

c++ c
1个回答
5
投票

不要强制冲洗:

cout << ret[i] << endl;

这实际上是低效的,迫使流每次都刷新。而只是简单地使用\n;

cout << ret[i] << `\n';

此外,由于C ++试图保持与C的向后兼容性,C ++ iostream链接到C iostream。让它们保持同步是很昂贵的。如果您不在C ++应用程序中使用C iostream,则最好取消它们:

int main() {
    std::ios::sync_with_stdio(false);

    // Your code
}

构建这样的字符串不是最有效的方法:

ret += 'x' + leftBot + rightBot + leftTop + rightTop;

做你在C做的事:

ret += 'x';
ret += leftBot;
ret += rightBot;
ret += leftTop;
ret += rightTop;

您可能还希望确保字符串不会调整大小。在C版本中,您有最大尺寸。为什么不给C ++带来好处,以防止重新分配。

std::string ret;
ret.reserve(MAX_LENGTH);
© www.soinside.com 2019 - 2024. All rights reserved.