我一直在阅读关于java8 lambdas实现的演示文稿http://fr.slideshare.net/czechscala/java-8-under-the-hood
LambdaMetaFactory包含用于将lambda表达式转换为功能接口对象的引导方法.
这些bootstrap methods
是什么,它们是否相关invokedynamic
?
我compareAndSwap
在StackOverflow答案中找到了这段代码:
boolean CompareAndSwapPointer(volatile * void * ptr,
void * new_value,
void * old_value) {
#if defined(_MSC_VER)
if (InterlockedCompareExchange(ptr, new_value, old_value) == old_value) return false;
else return true;
#elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
return __sync_bool_compare_and_swap(ptr, old_value, new_value);
#else
# error No implementation
#endif
}
Run Code Online (Sandbox Code Playgroud)
这是使用便携式快速代码的最合适方式(除了程序集内联).
此外,一个问题是这些特定builtin
方法具有不同的参数并从一个编译器返回另一个编译器的值,这可能需要一些额外的更改,如if then else
本示例中所示.
另一个问题是这些builtin
方法在机器代码级别中的行为,它们的行为是否完全相同?(例如使用相同的装配说明)
注意:另一个问题是,如果有许多支持的平台不仅仅是(Windows
和Linux
)在这个例子中.代码可能会变得非常大.
我正在做一些性能测试JVM
,我想测量内在函数使用的影响.
我想在JIT
不进入解释模式的情况下禁用某些方法使用内在函数.有没有办法做到这一点 ?谢谢
我想知道sun.misc.unsafe.arrayIndexScale的用法是什么,javadoc
据说:
报告在给定数组类的存储分配中寻址元素的比例因子.但是,"窄"类型的数组通常不能像访问器那样正常工作
getByte(java.lang.Object,int)
,因此这类的比例因子报告为零.
此方法返回一个int
,但我不确定该值的含义.
我已经使用了这个基准测试java8-lambda-performance-test,在运行它时我做了以下几点:
1.Disabled内在用法
2.Disabled Inlining
3.Disabled编译模式
我发现禁用两个第一次优化对结果没有影响.
这很奇怪,而且当运行基准和打印内在时,我没有找到任何对内在的调用 compiledLambdaForm
由于数学内在函数大量使用_min,_pow ...我期待禁用内在函数会降低性能
我已经开始Kcachegrind
用于性能分析.但我不明白GUI
和输出图.
例如,此调用图
SignatureIterator::iterate_parameters()
我不明白9.25%指的是什么?5 198x意味着多少次SignatureIterator::iterate_parameters()
叫 SignatureIterator::parse_type()
?100%in是什么意思Symbol::byte_at(int) const
?什么是ELF Object
?
注意:在官方文档http://kcachegrind.sourceforge.net/html/CallGraph.html中,但仍然不明白是什么the caller distance to the function
?
我正在阅读CLOCK_REALTIME
和之间的区别CLOCK_MONOTONIC
CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别?
该CLOCK_REALTIME
在时间的不连续性,可以跳向前和向后:是,在这个时钟的错误?如何使时间不一致的时钟可靠?
将使用不同 GCC 版本编译的源生成的对象链接到共享库是否安全?
我想不会,但是万一使用的 GCC 在代码生成和优化改进方面没有区别呢?有信息可以知道哪个 GCC 编译器不向后兼容吗?
我的问题也涉及二进制文件,我查看了
https://gcc.gnu.org/onlinedocs/gcc/Compatibility.html
据我了解,不同的GCC版本只要符合相同的ABI就可以兼容
在估计某个算法的时间复杂度时,我们用伪代码来说:
for (int i=0; i<n; i++) ---> O(n)
//comparison? ---> ?
//substitution ---> ?
for (int i=0; i<n; i++) ---> O(n)
//some function which is not recursive
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这些指令的时间复杂度是O(n)
因为我们迭代输入n
,但是比较和替换操作是否是恒定时间,因为它们不依赖于n
?
谢谢
java ×4
c ×2
jvm ×2
algorithm ×1
clock ×1
compilation ×1
gcc ×1
gettime ×1
intrinsics ×1
jit ×1
kcachegrind ×1
lambda ×1
linux ×1
system-calls ×1