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了呀,看多慢
相关阅读
epic悲剧了HR打电话推迟了PHONE INTERVIEW可是再也没消息了?硅谷的公司401k match都给的很低吗问个临时抱佛脚的问题bonus 和relocation fee 是在offer letter 里面一起的吗?a家onsite, 目前最后一个onsite, 极度不安中video interview什么意思国内小本毕业直接来美国google/fb工作了有哪些公司可以在入职前给relocation fee?三道 Amazon Onsite Coding 题 (转载)接受了A offer之后B公司出价更高,还可以跟A谈工资吗女考官咖啡店面试抱怨男子不买单 (转载)分享今天做的一道基础题两道google的题请教一个关于身份的问题How far will my salary go in another city?今天就做了两道题[合集] 麻烦大家给参考:我们去美国好还是留英国好一般多长时间写出code算合格?20分钟?请问这道behavior题想考察什么呀