[GR-80613] Improve performance of pidigits benchmark · oracle/graalpython@9f1382f · GitHub
Skip to content

Commit 9f1382f

Browse files
committed
[GR-80613] Improve performance of pidigits benchmark
PullRequest: graalpython/4940
2 parents 7e7182b + 6d274f6 commit 9f1382f

17 files changed

Lines changed: 125 additions & 108 deletions

File tree

‎graalpython/com.oracle.graal.python.test/src/tests/test_int.py‎

Lines changed: 30 additions & 0 deletions

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,7 @@ private void initializeTypes() {
12621262
}
12631263

12641264
private void populateBuiltins() {
1265+
sysModule = builtinModules.get(T_SYS);
12651266
assert PythonBuiltinClassType.verifySlotsConventions(builtins);
12661267
for (PythonBuiltins builtin : builtins) {
12671268
builtin.initialize(this);
@@ -1292,7 +1293,6 @@ private void populateBuiltins() {
12921293
}
12931294

12941295
// core machinery
1295-
sysModule = builtinModules.get(T_SYS);
12961296
sysModules = (PDict) sysModule.getAttribute(T_MODULES);
12971297
}
12981298

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java‎

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,9 @@
191191
import com.oracle.graal.python.lib.PyObjectDir;
192192
import com.oracle.graal.python.lib.PyObjectFormat;
193193
import com.oracle.graal.python.lib.PyObjectGetAIter;
194-
import com.oracle.graal.python.lib.PyObjectGetAttr;
195194
import com.oracle.graal.python.lib.PyObjectGetAttrO;
196195
import com.oracle.graal.python.lib.PyObjectGetIter;
196+
import com.oracle.graal.python.lib.PyObjectGetMethod;
197197
import com.oracle.graal.python.lib.PyObjectHashNode;
198198
import com.oracle.graal.python.lib.PyObjectIsInstanceNode;
199199
import com.oracle.graal.python.lib.PyObjectIsSubclassNode;
@@ -232,6 +232,7 @@
232232
import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode;
233233
import com.oracle.graal.python.nodes.call.CallDispatchers;
234234
import com.oracle.graal.python.nodes.call.CallNode;
235+
import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode;
235236
import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode;
236237
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
237238
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
@@ -283,7 +284,6 @@
283284
import com.oracle.truffle.api.CallTarget;
284285
import com.oracle.truffle.api.CompilerAsserts;
285286
import com.oracle.truffle.api.CompilerDirectives;
286-
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
287287
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
288288
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
289289
import com.oracle.truffle.api.RootCallTarget;
@@ -1575,14 +1575,13 @@ static Object ord(@SuppressWarnings("unused") Object obj,
15751575
@GenerateNodeFactory
15761576
public abstract static class PrintNode extends PythonBuiltinNode {
15771577
@Child private ReadAttributeFromModuleNode readStdout;
1578-
@CompilationFinal private PythonModule cachedSys;
15791578

15801579
@Specialization
15811580
@SuppressWarnings("unused")
15821581
PNone printNoKeywords(VirtualFrame frame, Object[] values, PNone sep, PNone end, PNone file, PNone flush,
15831582
@Bind Node inliningTarget,
1584-
@Shared("getWriteMethod") @Cached PyObjectGetAttr getWriteMethod,
1585-
@Shared("callWrite") @Cached CallNode callWrite,
1583+
@Shared("getWriteMethod") @Cached PyObjectGetMethod getWriteMethod,
1584+
@Shared("callWrite") @Cached CallBinaryMethodNode callWrite,
15861585
@Shared("callFlush") @Cached PyObjectCallMethodObjArgs callFlush,
15871586
@Shared("strNode") @Cached PyObjectStrAsObjectNode strNode) {
15881587
Object stdout = getStdout();
@@ -1596,23 +1595,22 @@ PNone printNoKeywords(VirtualFrame frame, Object[] values, PNone sep, PNone end,
15961595
@Specialization(guards = {"!isNone(file)", "!isNoValue(file)"})
15971596
static PNone printAllGiven(VirtualFrame frame, Object[] values, TruffleString sep, TruffleString end, Object file, boolean flush,
15981597
@Bind Node inliningTarget,
1599-
@Shared("getWriteMethod") @Cached PyObjectGetAttr getWriteMethod,
1600-
@Shared("callWrite") @Cached CallNode callWrite,
1598+
@Shared("getWriteMethod") @Cached PyObjectGetMethod getWriteMethod,
1599+
@Shared("callWrite") @Cached CallBinaryMethodNode callWrite,
16011600
@Shared("callFlush") @Cached PyObjectCallMethodObjArgs callFlush,
16021601
@Shared("strNode") @Cached PyObjectStrAsObjectNode strNode) {
16031602
int lastValue = values.length - 1;
1604-
// Note: the separate lookup is necessary due to different __getattr__ treatment than
1605-
// method lookup
1603+
// Resolve write once, before converting the values to strings.
16061604
Object writeMethod = getWriteMethod.execute(frame, inliningTarget, file, T_WRITE);
16071605
for (int i = 0; i < lastValue; i++) {
1608-
callWrite.execute(frame, writeMethod, strNode.execute(frame, inliningTarget, values[i]));
1609-
callWrite.execute(frame, writeMethod, sep);
1606+
callWrite.executeObject(frame, writeMethod, file, strNode.execute(frame, inliningTarget, values[i]));
1607+
callWrite.executeObject(frame, writeMethod, file, sep);
16101608
}
16111609
LoopNode.reportLoopCount(inliningTarget, values.length == 0 ? 0 : values.length - 1);
16121610
if (lastValue >= 0) {
1613-
callWrite.execute(frame, writeMethod, strNode.execute(frame, inliningTarget, values[lastValue]));
1611+
callWrite.executeObject(frame, writeMethod, file, strNode.execute(frame, inliningTarget, values[lastValue]));
16141612
}
1615-
callWrite.execute(frame, writeMethod, end);
1613+
callWrite.executeObject(frame, writeMethod, file, end);
16161614
if (flush) {
16171615
callFlush.execute(frame, inliningTarget, file, T_FLUSH);
16181616
}
@@ -1626,8 +1624,8 @@ PNone printGeneric(VirtualFrame frame, Object[] values, Object sepIn, Object end
16261624
@Cached CastToTruffleStringNode castSep,
16271625
@Cached CastToTruffleStringNode castEnd,
16281626
@Cached PyObjectIsTrueNode castFlush,
1629-
@Exclusive @Cached PyObjectGetAttr getWriteMethod,
1630-
@Exclusive @Cached CallNode callWrite,
1627+
@Exclusive @Cached PyObjectGetMethod getWriteMethod,
1628+
@Exclusive @Cached CallBinaryMethodNode callWrite,
16311629
@Exclusive @Cached PyObjectCallMethodObjArgs callFlush,
16321630
@Exclusive @Cached PyObjectStrAsObjectNode strNode,
16331631
@Cached PRaiseNode raiseNode) {
@@ -1665,20 +1663,7 @@ PNone printGeneric(VirtualFrame frame, Object[] values, Object sepIn, Object end
16651663
}
16661664

16671665
private Object getStdout() {
1668-
PythonModule sys;
1669-
if (getLanguage().isSingleContext()) {
1670-
if (cachedSys == null) {
1671-
CompilerDirectives.transferToInterpreterAndInvalidate();
1672-
cachedSys = getContext().lookupBuiltinModule(T_SYS);
1673-
}
1674-
sys = cachedSys;
1675-
} else {
1676-
if (cachedSys != null) {
1677-
CompilerDirectives.transferToInterpreterAndInvalidate();
1678-
cachedSys = null;
1679-
}
1680-
sys = getContext().lookupBuiltinModule(T_SYS);
1681-
}
1666+
PythonModule sys = getContext().getSysModule();
16821667
if (readStdout == null) {
16831668
CompilerDirectives.transferToInterpreterAndInvalidate();
16841669
readStdout = insert(ReadAttributeFromModuleNode.create());

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ReadlineModuleBuiltins.java‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242

4343
import static com.oracle.graal.python.nodes.BuiltinNames.J_READLINE;
4444
import static com.oracle.graal.python.nodes.BuiltinNames.T_READLINE;
45-
import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS;
4645
import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING;
4746
import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached;
4847
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
@@ -115,7 +114,7 @@ public void postInitialize(Python3Core core) {
115114
module.setAttribute(T_BACKEND, T_JLINE);
116115
LocalData moduleState = new LocalData();
117116
module.setModuleState(moduleState);
118-
Object consoleHandler = core.lookupBuiltinModule(T_SYS).getAttribute(T__CONSOLE_HANDLER);
117+
Object consoleHandler = core.getSysModule().getAttribute(T__CONSOLE_HANDLER);
119118
if (consoleHandler != PNone.NO_VALUE) {
120119
InteropLibrary lib = InteropLibrary.getUncached(consoleHandler);
121120
try {

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@
9494
import static com.oracle.graal.python.nodes.BuiltinNames.T_STDERR;
9595
import static com.oracle.graal.python.nodes.BuiltinNames.T_STDIN;
9696
import static com.oracle.graal.python.nodes.BuiltinNames.T_STDOUT;
97-
import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS;
9897
import static com.oracle.graal.python.nodes.BuiltinNames.T_UNRAISABLEHOOK;
9998
import static com.oracle.graal.python.nodes.BuiltinNames.T___BREAKPOINTHOOK__;
10099
import static com.oracle.graal.python.nodes.BuiltinNames.T___DISPLAYHOOK__;
@@ -614,7 +613,7 @@ public static PTuple createIntInfo(PythonLanguage language) {
614613

615614
public void postInitialize0(Python3Core core) {
616615
super.postInitialize(core);
617-
PythonModule sys = core.lookupBuiltinModule(T_SYS);
616+
PythonModule sys = core.getSysModule();
618617
PythonContext context = core.getContext();
619618
PythonLanguage language = core.getLanguage();
620619
String[] args = context.getEnv().getApplicationArguments();
@@ -761,7 +760,7 @@ private static Object[] convertToObjectArray(TruffleString[] arr) {
761760
public void postInitialize(Python3Core core) {
762761
postInitialize0(core);
763762
initStd(core);
764-
PythonModule sys = core.lookupBuiltinModule(T_SYS);
763+
PythonModule sys = core.getSysModule();
765764
core.getContext().registerCApiHook(() -> {
766765
sys.setAttribute(toTruffleStringUncached("_dllhandle_name"), toTruffleStringUncached(core.getContext().getCApiContext().getLibraryName()));
767766
});
@@ -777,7 +776,7 @@ static void initStd(Python3Core core) {
777776
TruffleString stdioEncoding = gp.getStdIOEncoding();
778777
TruffleString stdioError = gp.getStdIOError();
779778
PosixSupport posixSupport = context.getPosixSupport();
780-
PythonModule sysModule = core.lookupBuiltinModule(T_SYS);
779+
PythonModule sysModule = core.getSysModule();
781780

782781
// Note that stdin is always buffered, this only applies to stdout and stderr
783782
boolean buffering = !context.getOption(PythonOptions.UnbufferedIO);

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WarningsModuleBuiltins.java‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import static com.oracle.graal.python.nodes.BuiltinNames.J__WARNINGS;
4545
import static com.oracle.graal.python.nodes.BuiltinNames.T_MODULE;
4646
import static com.oracle.graal.python.nodes.BuiltinNames.T_MODULES;
47-
import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS;
4847
import static com.oracle.graal.python.nodes.BuiltinNames.T__WARNINGS;
4948
import static com.oracle.graal.python.nodes.BuiltinNames.T___MAIN__;
5049
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___LOADER__;
@@ -405,7 +404,7 @@ private PDict getSysDict() {
405404
reportPolymorphicSpecialize();
406405
getDictNode = insert(GetOrCreateDictNode.create());
407406
}
408-
return getDictNode.executeCached(getContext().lookupBuiltinModule(T_SYS));
407+
return getDictNode.executeCached(getContext().getSysModule());
409408
}
410409

411410
private PFrame getCallerFrame(VirtualFrame frame, int stackLevel, TruffleString[] skipFilePrefixes) {
@@ -520,7 +519,7 @@ private static Object getWarningsAttr(VirtualFrame frame, BoundaryCallData bound
520519
return null;
521520
}
522521
} else {
523-
Object sys = context.lookupBuiltinModule(T_SYS);
522+
Object sys = context.getSysModule();
524523
Object modules = lookup.executeCached(frame, sys, T_MODULES);
525524
try {
526525
warningsModule = callMethod.executeCached(frame, modules, T_GET, T_WARNINGS, PNone.NONE);

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSysBuiltins.java‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed;
5151
import static com.oracle.graal.python.nodes.BuiltinNames.T_STDERR;
5252
import static com.oracle.graal.python.nodes.BuiltinNames.T_STDOUT;
53-
import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS;
5453
import static com.oracle.graal.python.runtime.PythonContext.NATIVE_NULL;
5554

5655
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
@@ -87,7 +86,7 @@ Object getObject(TruffleString name,
8786
@Cached PyObjectLookupAttr lookupNode,
8887
@Cached PyObjectSetAttr setAttrNode) {
8988
try {
90-
PythonModule sys = getCore().lookupBuiltinModule(T_SYS);
89+
PythonModule sys = getCore().getSysModule();
9190
Object value = lookupNode.execute(null, inliningTarget, sys, name);
9291
if (value == PNone.NO_VALUE) {
9392
return NATIVE_NULL;
@@ -109,7 +108,7 @@ Object getObject(TruffleString name,
109108
private static Object selectOut(int fd) {
110109
CompilerAsserts.neverPartOfCompilation();
111110
Object file;
112-
PythonModule sys = PythonContext.get(null).lookupBuiltinModule(T_SYS);
111+
PythonModule sys = PythonContext.get(null).getSysModule();
113112
if (fd == 0) {
114113
file = sys.getAttribute(T_STDOUT);
115114
} else {

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java‎

Lines changed: 29 additions & 2 deletions

0 commit comments

Comments
 (0)