w*s
2 楼
rt
h*e
3 楼
不错,学习了。 不过, 工程里用的多么,这种写法我是头一次见到。
s*i
7 楼
这种题很无聊。
r*k
13 楼
这个不懂
你的意思是说,还是这个诡异的方法更快?
那应该写成library让大家用,不用每个人写出这种后人看不懂的东东
看了眼java的实现
不过java是跑在jvm上的,没啥可比性
/**
* Returns the greater of two {@code int} values. That is, the
* result is the argument closer to the value of
* {@link Integer#MAX_VALUE}. If the arguments have the same value,
* the result is that same value.
*
* @param a an argument.
* @param b another argument.
* @return the larger of {@code a} and {@code b}.
*/
public static int max(int a, int b) {
return (a >= b) ? a : b;
}
【在 w********s 的大作中提到】
: cpu是流水的,如果branch预测失败要排空的话,就是16个cycle
你的意思是说,还是这个诡异的方法更快?
那应该写成library让大家用,不用每个人写出这种后人看不懂的东东
看了眼java的实现
不过java是跑在jvm上的,没啥可比性
/**
* Returns the greater of two {@code int} values. That is, the
* result is the argument closer to the value of
* {@link Integer#MAX_VALUE}. If the arguments have the same value,
* the result is that same value.
*
* @param a an argument.
* @param b another argument.
* @return the larger of {@code a} and {@code b}.
*/
public static int max(int a, int b) {
return (a >= b) ? a : b;
}
【在 w********s 的大作中提到】
: cpu是流水的,如果branch预测失败要排空的话,就是16个cycle
w*s
14 楼
java一向慢的呀
http://gcc.gnu.org/ml/libstdc++/2003-11/msg00295.html
【在 r*******k 的大作中提到】
: 这个不懂
: 你的意思是说,还是这个诡异的方法更快?
: 那应该写成library让大家用,不用每个人写出这种后人看不懂的东东
: 看了眼java的实现
: 不过java是跑在jvm上的,没啥可比性
: /**
: * Returns the greater of two {@code int} values. That is, the
: * result is the argument closer to the value of
: * {@link Integer#MAX_VALUE}. If the arguments have the same value,
: * the result is that same value.
http://gcc.gnu.org/ml/libstdc++/2003-11/msg00295.html
【在 r*******k 的大作中提到】
: 这个不懂
: 你的意思是说,还是这个诡异的方法更快?
: 那应该写成library让大家用,不用每个人写出这种后人看不懂的东东
: 看了眼java的实现
: 不过java是跑在jvm上的,没啥可比性
: /**
: * Returns the greater of two {@code int} values. That is, the
: * result is the argument closer to the value of
: * {@link Integer#MAX_VALUE}. If the arguments have the same value,
: * the result is that same value.
r*k
16 楼
神奇啊,受教了
谢谢
楼主share一下你看的啥东西吧
不过这么底层的优化,
工作中碰到的机会太少了
【在 w********s 的大作中提到】
: java一向慢的呀
: http://gcc.gnu.org/ml/libstdc++/2003-11/msg00295.html
谢谢
楼主share一下你看的啥东西吧
不过这么底层的优化,
工作中碰到的机会太少了
【在 w********s 的大作中提到】
: java一向慢的呀
: http://gcc.gnu.org/ml/libstdc++/2003-11/msg00295.html
S*A
17 楼
这些都是老掉牙的假设了。
现在的 CPU 有很多技巧,这种 ugly hack 已经完全没有现实意义了。
其中一个是,现在 CPU 有 conditional mov instruction。
a > b ? a : b 这种实现完全可以用没有branch 来实现的,
而且常见的 compiler 都支持了。
例如这个程序:
int d(int a, int b)
{
return a >= b? a : b;
}
$ gcc -O2 -c -S /tmp/d.c
$ cat d.s
.LFB0:
.cfi_startproc
cmpl %esi, %edi
movl %esi, %eax
cmovge %edi, %eax
ret
看到没有, gcc 自己就会用 cmov instruction。
所以 branch predict 那个理由在现在的机器就不成立。
【在 w********s 的大作中提到】
: cpu是流水的,如果branch预测失败要排空的话,就是16个cycle
现在的 CPU 有很多技巧,这种 ugly hack 已经完全没有现实意义了。
其中一个是,现在 CPU 有 conditional mov instruction。
a > b ? a : b 这种实现完全可以用没有branch 来实现的,
而且常见的 compiler 都支持了。
例如这个程序:
int d(int a, int b)
{
return a >= b? a : b;
}
$ gcc -O2 -c -S /tmp/d.c
$ cat d.s
.LFB0:
.cfi_startproc
cmpl %esi, %edi
movl %esi, %eax
cmovge %edi, %eax
ret
看到没有, gcc 自己就会用 cmov instruction。
所以 branch predict 那个理由在现在的机器就不成立。
【在 w********s 的大作中提到】
: cpu是流水的,如果branch预测失败要排空的话,就是16个cycle
S*A
20 楼
不知道不可怕,误导别人就不好了。
你的 6 cycle CMOV 是什么年代的机器啊?
要不要我来教你如何看 instruction cycle 啊?
http://www.intel.com/content/dam/www/public/us/en/documents/man
翻到 appendix C -27 页。
CMOVcc 是 2 cycle.
CMOVBE/NBE/NA 是 3 cycle。
对比一下两个实现:
return a >= b? a : b;
cmpl %esi, %edi
movl %esi, %eax
cmovge %edi, %eax
return b ^((a^b) & -(a < b));
xorl %eax, %eax
cmpl %esi, %edi
setl %al
xorl %esi, %edi
negl %eax
andl %edi, %eax
xorl %esi, %eax
就算 cmovge 是 3, 不是 1,差别是 2 ,
你的那个实现里面多了止不止 2 个instruction?
你的实现整整多了 4 个 instruction.
把代码写那么难懂,然后还要更慢,图什么啊,就是
为了 show off ??
【在 w********s 的大作中提到】
: cmov也要6个cycle了呀,看多慢
你的 6 cycle CMOV 是什么年代的机器啊?
要不要我来教你如何看 instruction cycle 啊?
http://www.intel.com/content/dam/www/public/us/en/documents/man
翻到 appendix C -27 页。
CMOVcc 是 2 cycle.
CMOVBE/NBE/NA 是 3 cycle。
对比一下两个实现:
return a >= b? a : b;
cmpl %esi, %edi
movl %esi, %eax
cmovge %edi, %eax
return b ^((a^b) & -(a < b));
xorl %eax, %eax
cmpl %esi, %edi
setl %al
xorl %esi, %edi
negl %eax
andl %edi, %eax
xorl %esi, %eax
就算 cmovge 是 3, 不是 1,差别是 2 ,
你的那个实现里面多了止不止 2 个instruction?
你的实现整整多了 4 个 instruction.
把代码写那么难懂,然后还要更慢,图什么啊,就是
为了 show off ??
【在 w********s 的大作中提到】
: cmov也要6个cycle了呀,看多慢
相关阅读
简历求教。Linkedin选组感叹一下NYC commercial bank招人, Basel II risk modeling experienc背着自己公司为另一家公司工作有问题吗?如何用CUDA同时计算几百个实对称矩阵的eigenvalues/eigenvecot (转载)问个关于background 和reference check的10月1日之前H-1b的transferpurdue普渡大学版100个包子Can I work for 2 employers in 17 months OPT extension?oh god! just blow up a phone screen全球500强制药公司Sr. Scientist工资(Update 2)Feedback call? 不会专门打电话根我说没戏了吧?staffing company可以加入两个么Multithread会因为negotiate薪水拿不到正式offer吗?H1B RFE 后approved, 时间供大家参考北加州湾区招energy engineer3~6年exp, Ruby Developer , 140K in LA最近LayOff很多,交流一下行业/地区吧