-
-
Notifications
You must be signed in to change notification settings - Fork 925
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Various literal to_proc'ed Symbol optimizations.
* Use a dummy binding rather than creating new every time. * Cache the resulting proc at create site. The second optimization results in a given &:foo in code only creating a single Proc, ever, and caching it at that point in the code. This is based on the observation that symbol procs typically are used to iterate over homogeneous collections of objects, so caching the proc allows its cache to stay populated and local to the related code. This also eliminates the allocation of a Block, BlockBody, and RubyProc for each encounter, which improves perf also for heterogeneous collections with poor cacheability. Benchmark: ```ruby loop { puts Benchmark.measure { ary = [1,2,3,4] 1_000_000.times { ary.each(&:object_id) } } } ``` Before: ``` 1.270000 0.070000 1.340000 ( 0.710043) 0.640000 0.020000 0.660000 ( 0.511692) 0.470000 0.000000 0.470000 ( 0.460667) 0.490000 0.010000 0.500000 ( 0.480732) 0.470000 0.000000 0.470000 ( 0.462888) ``` Just the dummy binding optimization: ``` 1.210000 0.070000 1.280000 ( 0.660924) 0.540000 0.020000 0.560000 ( 0.432614) 0.430000 0.000000 0.430000 ( 0.422502) 0.430000 0.000000 0.430000 ( 0.416549) 0.410000 0.010000 0.420000 ( 0.412461) ``` And with proc caching: ``` 0.890000 0.060000 0.950000 ( 0.456065) 0.410000 0.020000 0.430000 ( 0.279023) 0.290000 0.000000 0.290000 ( 0.282117) 0.300000 0.010000 0.310000 ( 0.288516) 0.270000 0.000000 0.270000 ( 0.270100) ```
- 9.4.12.0
- 9.4.11.0
- 9.4.10.0
- 9.4.9.0
- 9.4.8.0
- 9.4.7.0
- 9.4.6.0
- 9.4.5.0
- 9.4.4.0
- 9.4.3.0
- 9.4.2.0
- 9.4.1.0
- 9.4.0.0
- 9.3.15.0
- 9.3.14.0
- 9.3.13.0
- 9.3.12.0
- 9.3.11.0
- 9.3.10.0
- 9.3.9.0
- 9.3.8.0
- 9.3.7.0
- 9.3.6.0
- 9.3.5.0
- 9.3.4.0
- 9.3.3.0
- 9.3.2.0
- 9.3.1.0
- 9.3.0.0
- 9.2.21.0
- 9.2.20.1
- 9.2.20.0
- 9.2.19.0
- 9.2.18.0
- 9.2.17.0
- 9.2.16.0
- 9.2.15.0
- 9.2.14.0
- 9.2.13.0
- 9.2.12.0
- 9.2.11.1
- 9.2.11.0
- 9.2.10.0
- 9.2.9.0
- 9.2.8.0
- 9.2.7.0
- 9.2.6.0
- 9.2.5.0
- 9.2.4.1
- 9.2.4.0
- 9.2.3.0
- 9.2.2.0
- 9.2.1.0
- 9.2.0.0
- 9.1.17.0
- 9.1.16.0
- 9.1.15.0
- 9.1.14.0
- 9.1.13.0
- 9.1.12.0
- 9.1.11.0
- 9.1.10.0
- 9.1.9.0
- 9.1.8.0
- 9.1.7.0
- 9.1.6.0
- 9.1.5.0
- 9.1.4.0
- 9.1.3.0
- 9.1.2.0
- 9.1.1.0
- 9.1.0.0
- 9.0.5.0
Showing
10 changed files
with
221 additions
and
68 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
package org.jruby.ir.operands; | ||
|
||
import org.jcodings.Encoding; | ||
import org.jruby.ir.IRVisitor; | ||
import org.jruby.ir.persistence.IRReaderDecoder; | ||
import org.jruby.ir.persistence.IRWriterEncoder; | ||
import org.jruby.ir.runtime.IRRuntimeHelpers; | ||
import org.jruby.runtime.ThreadContext; | ||
|
||
/** | ||
* A literal representing proc'ified symbols, as in &:foo. | ||
* | ||
* Used to cache a unique and constant proc at the use site to reduce allocation and improve caching. | ||
*/ | ||
public class SymbolProc extends ImmutableLiteral { | ||
private final String name; | ||
private final Encoding encoding; | ||
|
||
public SymbolProc(String name, Encoding encoding) { | ||
super(); | ||
this.name = name; | ||
this.encoding = encoding; | ||
} | ||
|
||
@Override | ||
public OperandType getOperandType() { | ||
return OperandType.SYMBOL_PROC; | ||
} | ||
|
||
@Override | ||
public Object createCacheObject(ThreadContext context) { | ||
return IRRuntimeHelpers.newSymbolProc(context, name, encoding); | ||
} | ||
|
||
@Override | ||
public int hashCode() { | ||
return 47 * 7 + (int) (this.name.hashCode() ^ (this.encoding.hashCode() >>> 32)); | ||
} | ||
|
||
@Override | ||
public boolean equals(Object other) { | ||
return other instanceof SymbolProc && name.equals(((SymbolProc) other).name) && encoding.equals(((SymbolProc) other).encoding); | ||
} | ||
|
||
@Override | ||
public void visit(IRVisitor visitor) { | ||
visitor.SymbolProc(this); | ||
} | ||
|
||
public String getName() { | ||
return name; | ||
} | ||
|
||
public Encoding getEncoding() { | ||
return encoding; | ||
} | ||
|
||
@Override | ||
public void encode(IRWriterEncoder e) { | ||
super.encode(e); | ||
e.encode(name); | ||
e.encode(encoding); | ||
} | ||
|
||
public static SymbolProc decode(IRReaderDecoder d) { | ||
return new SymbolProc(d.decodeString(), d.decodeEncoding()); | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return "SymbolProc:" + name; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
69662ab
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you need a binding anyway? MRI:
Is the 'C level Proc' some kind of indirection written in C that does
send(:symbol)
?