f*********e 发帖数: 10 | 1 void init_f (void)
{
char c[256] = {0};
int i = 0;
for (i = 0; i < 256; i++)
c[i] = (char) i;
} |
D*******a 发帖数: 3688 | 2 用uint64一次加8个字节
【在 f*********e 的大作中提到】 : void init_f (void) : { : char c[256] = {0}; : int i = 0; : for (i = 0; i < 256; i++) : c[i] = (char) i; : }
|
p***o 发帖数: 1252 | 3 void init_f (void)
{
/* char c[256] = {0};
int i = 0;
for (i = 0; i < 256; i++)
c[i] = (char) i;*/
} |
k**********g 发帖数: 989 | 4 static const char c[256] =
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, tnnd ...
}; |
n******t 发帖数: 4406 | 5 你这是什么东东?好像啥也没做。
【在 f*********e 的大作中提到】 : void init_f (void) : { : char c[256] = {0}; : int i = 0; : for (i = 0; i < 256; i++) : c[i] = (char) i; : }
|
f*********e 发帖数: 10 | 6 It's a piece of code to test if you can optimize it so it runs faster than
the current implementation.
【在 n******t 的大作中提到】 : 你这是什么东东?好像啥也没做。
|
g*****y 发帖数: 7271 | 7 纯从code看的话,把这个function直接丢掉运行最快,因为它什么也没做啊。
我估计是这个原因才有前面的问题的吧?
【在 f*********e 的大作中提到】 : It's a piece of code to test if you can optimize it so it runs faster than : the current implementation.
|
f*********e 发帖数: 10 | 8 this is one of the interview questions. I cannot figure it out. So put it
here and see if any gurus have any ideas to optimize it to run faster.
【在 g*****y 的大作中提到】 : 纯从code看的话,把这个function直接丢掉运行最快,因为它什么也没做啊。 : 我估计是这个原因才有前面的问题的吧?
|
y***d 发帖数: 2330 | 9 simply
const char s0[256] = {0, 1, 2, 3, ...., 255}
memcpy ...
【在 f*********e 的大作中提到】 : this is one of the interview questions. I cannot figure it out. So put it : here and see if any gurus have any ideas to optimize it to run faster.
|
L***n 发帖数: 6727 | 10 i guess they are testing you some basic optimization techniques like loop
unrolling, etc
【在 f*********e 的大作中提到】 : this is one of the interview questions. I cannot figure it out. So put it : here and see if any gurus have any ideas to optimize it to run faster.
|
|
|
p*********t 发帖数: 2690 | 11 o(n),难道要优化成o(1)?
想不出来。难道是要用List之类的?
【在 f*********e 的大作中提到】 : void init_f (void) : { : char c[256] = {0}; : int i = 0; : for (i = 0; i < 256; i++) : c[i] = (char) i; : }
|
g*****y 发帖数: 7271 | 12 面试问题的话,很多是等着你去问的,看你提的问题就知道你对问题的理解程度了。
如果一定要运行时初始化内存的话,用memcpy那个帖子应该就可以了。其实就是
先单个拷贝不对齐的字节,对于对齐的部分,一次copy 32bits 或 64bits,
比挨个字节赋值要快得多。
【在 f*********e 的大作中提到】 : this is one of the interview questions. I cannot figure it out. So put it : here and see if any gurus have any ideas to optimize it to run faster.
|
S**I 发帖数: 15689 | 13 void init_f(void)
char c[256];
uint64_t* l = (uint64_t*) c;
int i;
// if big-endian, use
// l[0] = 0x0001020304050607;
l[0] = 0x0706050403020100;
for (i = 1; i < 32; i++)
l[i] = l[i-1] + 0x0808080808080808;
}
【在 f*********e 的大作中提到】 : void init_f (void) : { : char c[256] = {0}; : int i = 0; : for (i = 0; i < 256; i++) : c[i] = (char) i; : }
|
p********s 发帖数: 37 | 14 几个可能的地方:
1.char c[256] = {0}; 会从头到尾把数组赋值成0,没意义
2.if (a
3.c[i] 相当于 *(c+i),比c++和c--浪费
4.不要强制类型转化i,循环变量直接用char
5.见楼上大牛 |
o*****n 发帖数: 94 | 15 都是大牛啊
【在 p********s 的大作中提到】 : 几个可能的地方: : 1.char c[256] = {0}; 会从头到尾把数组赋值成0,没意义 : 2.if (a: 3.c[i] 相当于 *(c+i),比c++和c--浪费 : 4.不要强制类型转化i,循环变量直接用char : 5.见楼上大牛
|
k**********g 发帖数: 989 | 16
我笑了
【在 p********s 的大作中提到】 : 几个可能的地方: : 1.char c[256] = {0}; 会从头到尾把数组赋值成0,没意义 : 2.if (a: 3.c[i] 相当于 *(c+i),比c++和c--浪费 : 4.不要强制类型转化i,循环变量直接用char : 5.见楼上大牛
|
p********s 发帖数: 37 | |
t****t 发帖数: 6806 | 18 呃, 你弄明白了他笑的原因吗?
【在 p********s 的大作中提到】 : 自嘲下,多谢楼上
|
p********s 发帖数: 37 | 19 大概是因为int转char是直接低位拷贝吧,大牛们指点下
【在 t****t 的大作中提到】 : 呃, 你弄明白了他笑的原因吗?
|
p***o 发帖数: 1252 | 20 你写出来跑跑看就知道了。
【在 p********s 的大作中提到】 : 大概是因为int转char是直接低位拷贝吧,大牛们指点下
|
|
|
t****t 发帖数: 6806 | 21 char的范围就是0-255, 现在需要0-255. 那什么时候循环能退出呢?
【在 p********s 的大作中提到】 : 大概是因为int转char是直接低位拷贝吧,大牛们指点下
|
p********s 发帖数: 37 | 22 void init_f (void)
{
char c[256];
char *cp = c+255;
char i = -1;
while(i)
*cp-- = i--;
c[0] = 0;
}
还是没明白,跑了结果貌似没啥问题,大牛们直说吧。明天电面了,救人一命胜造七级
浮屠啊 |
p********s 发帖数: 37 | 23 啊原来是这个,用了不是很elegant的overflow,见楼上。。
我还以为笑话我那个不要类型转化不是优化呢
【在 t****t 的大作中提到】 : char的范围就是0-255, 现在需要0-255. 那什么时候循环能退出呢?
|
t****t 发帖数: 6806 | 24 yeah, so you have to do it in two steps: 1-255 and 0. what's the point?
【在 p********s 的大作中提到】 : 啊原来是这个,用了不是很elegant的overflow,见楼上。。 : 我还以为笑话我那个不要类型转化不是优化呢
|
p********s 发帖数: 37 | 25 每次循环省一个i
【在 t****t 的大作中提到】 : yeah, so you have to do it in two steps: 1-255 and 0. what's the point?
|
p********s 发帖数: 37 | 26 啊。。明白了,受教受教。一年多没写程序汇编指令忘光了,不好意思 |
f*********e 发帖数: 10 | 27 我笨, 明白了啥? 能直说吗? 让咱刚入们的长点见识
【在 p********s 的大作中提到】 : 啊。。明白了,受教受教。一年多没写程序汇编指令忘光了,不好意思
|
t****t 发帖数: 6806 | 28 well, for one thing, nowadays it's usually not advised to manually or
mentally do C->assembly mapping.
【在 p********s 的大作中提到】 : 啊。。明白了,受教受教。一年多没写程序汇编指令忘光了,不好意思
|
p********s 发帖数: 37 | 29 不好意思光顾向大牛们学习没说清楚,俺之前共犯了俩错误,一个是之前说的,int转
char是没有花费的,所以不需要优化循环变量i;另一个是我以为把for里面的判断句从
i<256改成i能节约一个比较,但是好像汇编里j类跳转指令依赖的signal都是要cmp指令
先赋值的,所以这个优化也没啥意义。。
【在 f*********e 的大作中提到】 : 我笨, 明白了啥? 能直说吗? 让咱刚入们的长点见识
|
L***n 发帖数: 6727 | 30 so 8086ish...
【在 p********s 的大作中提到】 : 不好意思光顾向大牛们学习没说清楚,俺之前共犯了俩错误,一个是之前说的,int转 : char是没有花费的,所以不需要优化循环变量i;另一个是我以为把for里面的判断句从 : i<256改成i能节约一个比较,但是好像汇编里j类跳转指令依赖的signal都是要cmp指令 : 先赋值的,所以这个优化也没啥意义。。
|
|
|
H****r 发帖数: 2801 | 31 这init_f(void)整个来看好像没做啥实际有意义的啊?
【在 f*********e 的大作中提到】 : void init_f (void) : { : char c[256] = {0}; : int i = 0; : for (i = 0; i < 256; i++) : c[i] = (char) i; : }
|
H****r 发帖数: 2801 | 32 #define SPEC_CHAR_ARRY {0, 1, 2, 3, ...., 255}
void init_f (void)
{
char c[] = SPEC_CHAR_ARRY;
// do sth ...
}
【在 y***d 的大作中提到】 : simply : const char s0[256] = {0, 1, 2, 3, ...., 255} : memcpy ...
|