private double allocateConditionally( final ThreadLocalRandom rnd ) {
final Vector2D v;
if( rnd.nextBoolean() ) {
v = new Vector2D( 1, rnd.nextDouble() );
} else {
v = new Vector2D( rnd.nextDouble(), 1 );
}
return v.length();
}не скаляризуется — хотя интуитивно кажется, что скаляризация здесь должна быть тривиальной. А что если немного добавить аллокаций?
private double allocateConditionally2( final ThreadLocalRandom rnd ) {
final Vector2D result = new Vector2D();
if( rnd.nextBoolean() ) {
final Vector2D v = new Vector2D( 1, rnd.nextDouble() );
result.copyFrom(v);
} else {
final Vector2D v = new Vector2D( rnd.nextDouble(), 1 );
result.copyFrom(v);
}
return result.length();
}В этом коде на одну точку аллокации больше — но все эти аллокации успешно скаляризуются. В общем-то, ничего особо удивительного: здесь каждая ссылочная переменная в любых сценариях исполнения всегда адресует один-единственный объект, поэтому никаких сложностей у скаляризации не возникает :)
А почему ты не пишешь посты по-английски?
ОтветитьУдалитьЯ не настолько хорошо знаю английский, чтобы свободно выражать через него свои мысли со всеми побочными коннотациями. То есть писать на нем я могу, но графоманского удовольствия от этого не получаю :)
УдалитьА во-вторых на английском и так полно информации -- какой смысл?