sprintf的这两种用法之间的性能是否存在差异?

时间:2015-08-11 02:26:19

标签: c performance printf

我正在尝试打印一周中的不同日期,具体取决于变量的值。每天都按特定数字映射。

我想要将转换号码转换为MondayTuesday等。例如:

#include <stdio.h>
int main(){
    int a=1;
    char buf[16];
    sprintf(buf,"%s",a==1?"Monday":a==2?"Tuesday":a==3?"Wednesday":a==4?"Thursday":a==5?"Friday":a==6?"Saturday":a==7?"Sunday":"Unknown day");
    printf("%s",buf);
    return 0;
}

我想知道使用以下方式是否更有效(性能方面),因为所有字符串都以相同的后缀(“day”)结尾:

sprintf(buf,"%sday",a==1?"Mon":a==2?"Tues":a==3?"Wednes":a==4?"Thurs":a==5?"Fri":a==6?"Satur":a==7?"Sun":"Unknown ");

那么,这两者之间的内存使用或性能是否存在差异?

2 个答案:

答案 0 :(得分:1)

性能差异当然可以忽略不计。在幕后,我们只考虑了几个解除引用。

示例中的所有字符串都将存储在只读内存中(字符串文字所在的位置),很可能存储在连续的内存位置(彼此相邻)。既然如此,那么组成这些字符串的所有字符很可能都会被机器存储在CPU缓存中,从而将访问时间缩短到不可检测的范围。

真正谋杀你的效率的是嵌套的三元运算符。这会产生比所需更多的装配。

做一个你想做的事情的更好方法是在映射到它们的特定索引处有一个值数组。例如:

char * days[] = {"Monday", "Tuesday", "Wednesday", ...};

sprintf(buf, "%s", days[a - 1]);

注意:a - 1,因为在您的示例中a似乎从1开始。

答案 1 :(得分:1)

最好不要幻想。

/* Returns name of given day of the week,
 * where Monday is day 1, and Sunday is day 7.
 */
const char *dayofweek(int day)
{
    switch (day) {
        case 1:  return "Monday";
        case 2:  return "Tuesday";
        case 3:  return "Wednesday";
        case 4:  return "Thursday";
        case 5:  return "Friday";
        case 6:  return "Saturday";
        case 7:  return "Sunday";
        default: return NULL;
    }
}

int main(void)
{
    int i;
    for (i=0; i<10; ++i) {
        const char *day = dayofweek(i);
        printf("Day %d of the week is %s\n", i, day ? day : "[invalid]");
    }
    return 0;
}