Review request for 7034570 - java.lang.Runtime.exec(String[] cmd, String[] env) can not work properly if SystemRoot not inherited
Ulf Zibis
Ulf.Zibis at gmx.de
Mon Apr 18 11:00:22 UTC 2011
Hi David,
much thanks for your detailed effort.
-Ulf
Am 17.04.2011 22:50, schrieb David Schlosnagle:
> On Sun, Apr 17, 2011 at 1:27 PM, Ulf Zibis<Ulf.Zibis at gmx.de> wrote:
>> Am 16.04.2011 16:45, schrieb David Schlosnagle:
>>> One minor nit in ProcessEnvironment.java
>>>
>>> 336 private static void addToEnv(StringBuilder sb, String name,
>>> String val) {
>>> 337 sb.append(name+"="+val+'\u0000');
>>> 338 }
>>>
>>> I think it should be as follows to avoid implicitly constructing
>>> another StringBuilder and the extra copying overhead;
>>>
>>> 336 private static void addToEnv(StringBuilder sb, String name,
>>> String val) {
>>> 337 sb.append(name).append('=').append(val).append('\u0000');
>>> 338 }
>>>
>> Because this suggestion was from me, I must admit, that I didn't prove, if
>> javac actually uses the existing StringBuilder sb, or forces another
>> StringBuilder to instantiate. I just assumed, javac would use the existing
>> one. So to be done:
>> - examine the byte code
>> - if not yet optimized: then new RFE for javac
> Ulf,
>
> I'm not the right person to comment on whether javac could safely
> optimize away the StringBuilder creation here per JLS 15.18.1 [1] [2],
> but in this situation I'd assume that the expression
> name+"="+val+'\u0000' must return a "result is a reference to a String
> object (newly created, unless the expression is a compile-time
> constant expression (§15.28))that is the concatenation of the two
> operand strings" in which case I don't think javac can optimize it
> away.
>
> Some IDEs such as IntelliJ offer code inspections to find and fix such
> items, see "String concatenation inside 'StringBuffer.append()'" [3]:
> This inspection reports any instances of String concatenation used as the
> argument to StringBuffer.append(), StringBuilder.append() or
> Appendable.append(). Such calls may profitably be turned into chained
> append calls on the existing StringBuffer/Builder/Appendable, saving the
> cost of an extra StringBuffer/Builder allocation.
>
> This inspection ignores compile time evaluated String concatenations, which
> when converted to chained append calls would only worsen performance.
>
> Here's a quick `javap -c -private` dump of these two different methods
> in a test class, showing that the changes I'm recommending simplify
> the bytecode and avoid the extra StringBuilder construction and
> copying of underlying characters:
>
>
> Before:
> private static void addToEnv(StringBuilder sb, String name, String val) {
> sb.append(name+"="+val+'\u0000');
> }
>
> Yields:
>
> private static void addToEnv(java.lang.StringBuilder,
> java.lang.String, java.lang.String);
> Code:
> 0: aload_0
> 1: new #2; //class java/lang/StringBuilder
> 4: dup
> 5: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
> 8: aload_1
> 9: invokevirtual #8; //Method
> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
> 12: ldc #9; //String =
> 14: invokevirtual #8; //Method
> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
> 17: aload_2
> 18: invokevirtual #8; //Method
> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
> 21: iconst_0
> 22: invokevirtual #10; //Method
> java/lang/StringBuilder.append:(C)Ljava/lang/StringBuilder;
> 25: invokevirtual #11; //Method
> java/lang/StringBuilder.toString:()Ljava/lang/String;
> 28: invokevirtual #8; //Method
> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
> 31: pop
> 32: return
>
> ----
>
> After:
> private static void addToEnv(StringBuilder sb, String name, String val) {
> sb.append(name).append('=').append(val).append('\u0000');
> }
>
> Yields:
>
> private static void addToEnv(java.lang.StringBuilder,
> java.lang.String, java.lang.String);
> Code:
> 0: aload_0
> 1: aload_1
> 2: invokevirtual #8; //Method
> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
> 5: bipush 61
> 7: invokevirtual #10; //Method
> java/lang/StringBuilder.append:(C)Ljava/lang/StringBuilder;
> 10: aload_2
> 11: invokevirtual #8; //Method
> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
> 14: iconst_0
> 15: invokevirtual #10; //Method
> java/lang/StringBuilder.append:(C)Ljava/lang/StringBuilder;
> 18: pop
> 19: return
>
> [1] http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18.1
> [2] http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18.1.2
> [3] http://www.jetbrains.com/idea/documentation/inspections/StringConcatenationInsideStringBufferAppend.html
>
>
> - Dave
>
More information about the core-libs-dev
mailing list