Skip to content

Commit dd590d5

Browse files
committed
[GR-17838] Add host interop benchmarks and change NodeContextManager to improve performance
PullRequest: graalpython/628
2 parents 3b15dc7 + f937c63 commit dd590d5

37 files changed

+710
-801
lines changed

ci.jsonnet

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ local const = import 'ci_common/constants.libsonnet';
33
local builder = import 'ci_common/builder.libsonnet';
44

55
{
6-
overlay: "4aeece36c7b5f22de14d72fe2f740f40d4e3ab63",
6+
overlay: "7ad24fb14b37e95aeac98c4dacf2e1350b928ad2",
77

88
// ======================================================================================================
99
//
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#!/usr/bin/env python
2+
# Copyright 2008-2010 Isaac Gouy
3+
# Copyright (c) 2013, 2014, Regents of the University of California
4+
# Copyright (c) 2017, 2019, Oracle and/or its affiliates.
5+
# All rights reserved.
6+
#
7+
# Revised BSD license
8+
#
9+
# This is a specific instance of the Open Source Initiative (OSI) BSD license
10+
# template http://www.opensource.org/licenses/bsd-license.php
11+
#
12+
# Redistribution and use in source and binary forms, with or without
13+
# modification, are permitted provided that the following conditions are met:
14+
#
15+
# Redistributions of source code must retain the above copyright notice, this
16+
# list of conditions and the following disclaimer.
17+
#
18+
# Redistributions in binary form must reproduce the above copyright notice,
19+
# this list of conditions and the following disclaimer in the documentation
20+
# and/or other materials provided with the distribution.
21+
#
22+
# Neither the name of "The Computer Language Benchmarks Game" nor the name of
23+
# "The Computer Language Shootout Benchmarks" nor the name "nanobench" nor the
24+
# name "bencher" nor the names of its contributors may be used to endorse or
25+
# promote products derived from this software without specific prior written
26+
# permission.
27+
#
28+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
32+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
34+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
36+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38+
39+
#runas solve()
40+
#pythran export solve()
41+
# 12/31/13 modified for benchmarking by Wei Zhang
42+
43+
from java.util import ArrayList
44+
45+
NUMS = ArrayList()
46+
47+
for pyline in [
48+
[ 8, 2,22,97,38,15, 0,40, 0,75, 4, 5, 7,78,52,12,50,77,91, 8,],
49+
[49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48, 4,56,62, 0,],
50+
[81,49,31,73,55,79,14,29,93,71,40,67,53,88,30, 3,49,13,36,65,],
51+
[52,70,95,23, 4,60,11,42,69,24,68,56, 1,32,56,71,37, 2,36,91,],
52+
[22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80,],
53+
[24,47,32,60,99, 3,45, 2,44,75,33,53,78,36,84,20,35,17,12,50,],
54+
[32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70,],
55+
[67,26,20,68, 2,62,12,20,95,63,94,39,63, 8,40,91,66,49,94,21,],
56+
[24,55,58, 5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72,],
57+
[21,36,23, 9,75, 0,76,44,20,45,35,14, 0,61,33,97,34,31,33,95,],
58+
[78,17,53,28,22,75,31,67,15,94, 3,80, 4,62,16,14, 9,53,56,92,],
59+
[16,39, 5,42,96,35,31,47,55,58,88,24, 0,17,54,24,36,29,85,57,],
60+
[86,56, 0,48,35,71,89, 7, 5,44,44,37,44,60,21,58,51,54,17,58,],
61+
[19,80,81,68, 5,94,47,69,28,73,92,13,86,52,17,77, 4,89,55,40,],
62+
[ 4,52, 8,83,97,35,99,16, 7,97,57,32,16,26,26,79,33,27,98,66,],
63+
[88,36,68,87,57,62,20,72, 3,46,33,67,46,55,12,32,63,93,53,69,],
64+
[ 4,42,16,73,38,25,39,11,24,94,72,18, 8,46,29,32,40,62,76,36,],
65+
[20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74, 4,36,16,],
66+
[20,73,35,29,78,31,90, 1,74,31,49,71,48,86,81,16,23,57, 5,54,],
67+
[ 1,70,54,71,83,51,54,69,16,92,33,48,61,43,52, 1,89,19,67,48,],
68+
]:
69+
jline = ArrayList()
70+
for n in pyline:
71+
jline.add(n)
72+
NUMS.add(jline)
73+
74+
75+
def seqs(nums, row, col):
76+
if row + 4 <= len(nums): yield list(nums[i][col] for i in range(row, row+4))
77+
if col + 4 <= len(nums[row]): yield list(nums[row][i] for i in range(col, col+4))
78+
if row + 4 <= len(nums) and col + 4 <= len(nums[row]): yield list(nums[row+i][col+i] for i in range(0,4))
79+
if row + 4 <= len(nums) and col >= 3: yield list(nums[row+i][col-i] for i in range(0,4))
80+
81+
82+
def product(seq):
83+
n = 1
84+
for x in seq:
85+
n = n * x
86+
return n
87+
88+
89+
def list_seqs(nums):
90+
for row in range(0, len(nums)):
91+
for col in range(0, len(nums[row])):
92+
for seq in seqs(nums, row, col):
93+
yield seq
94+
95+
96+
def solve():
97+
return _max(product(seq) for seq in list_seqs(NUMS))
98+
99+
100+
# test
101+
def _max(iterator):
102+
max = None
103+
for i in iterator:
104+
if max is None:
105+
max = i
106+
if i > max:
107+
max = i
108+
return max
109+
110+
111+
def main(iteration):
112+
for i in range(iteration):
113+
solve()
114+
115+
return solve()
116+
117+
118+
def measure(num):
119+
result = main(num)
120+
print('max: ', result)
121+
122+
123+
def __benchmark__(num=10000):
124+
measure(num)
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# Copyright (c) 2017, 2019, Oracle and/or its affiliates.
2+
# Copyright (c) 2013, Pablo Mouzo
3+
#
4+
# Permission is hereby granted, free of charge, to any person obtaining a copy
5+
# of this software and associated documentation files (the "Software"), to deal
6+
# in the Software without restriction, including without limitation the rights
7+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
# copies of the Software, and to permit persons to whom the Software is
9+
# furnished to do so, subject to the following conditions:
10+
#
11+
# The above copyright notice and this permission notice shall be included in all
12+
# copies or substantial portions of the Software.
13+
#
14+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20+
# SOFTWARE.
21+
22+
JAVA_CODE = """
23+
import java.util.ArrayList;
24+
import java.util.List;
25+
26+
public class Image {
27+
private final int width;
28+
private final int height;
29+
private final List<Integer> data;
30+
31+
public Image(int width, int height, List<Integer> data) {
32+
this.width = width;
33+
this.height = height;
34+
if (data != null) {
35+
this.data = data;
36+
} else {
37+
this.data = new ArrayList<Integer>(width * height);
38+
for (int i = 0; i < width * height; i++) {
39+
this.data.add(0);
40+
}
41+
}
42+
}
43+
44+
int _idx(int x, int y) {
45+
if (0 <= x && x < width && 0 <= y && y < height) {
46+
return y * width + x;
47+
} else {
48+
throw new ArrayIndexOutOfBoundsException();
49+
}
50+
}
51+
52+
int __getitem__(int x, int y) {
53+
return data.get(_idx(x, y));
54+
}
55+
56+
void __setitem__(int x, int y, int val) {
57+
data.set(_idx(x, y), val);
58+
}
59+
60+
public Image sobel(boolean horizontal, boolean vertical) {
61+
Image out = new Image(width, height, null);
62+
for (int y = 1; y < height - 1; y++) {
63+
for (int x = 1; x < width - 1; x++) {
64+
double dx;
65+
if (horizontal) {
66+
dx = -1.0 * __getitem__(x - 1, y - 1) + 1.0 * __getitem__(x + 1, y - 1) +
67+
-2.0 * __getitem__(x - 1, y) + 2.0 * __getitem__(x + 1, y) +
68+
-1.0 * __getitem__(x - 1, y + 1) + 1.0 * __getitem__(x + 1, y + 1);
69+
} else {
70+
dx = __getitem__(x, y);
71+
}
72+
double dy;
73+
if (vertical) {
74+
dy = -1.0 * __getitem__(x - 1, y - 1) - 2.0 * __getitem__(x, y - 1) - 1.0 * __getitem__(x + 1, y - 1) +
75+
1.0 * __getitem__(x - 1, y + 1) + 2.0 * __getitem__(x, y + 1) + 1.0 * __getitem__(x + 1, y + 1);
76+
} else {
77+
dy = __getitem__(x, y);
78+
}
79+
out.__setitem__(x, y, (int) Math.min(Math.round(Math.sqrt(dx * dx + dy * dy) / 4.0), 255));
80+
}
81+
}
82+
return out;
83+
}
84+
}
85+
"""
86+
87+
88+
def __setup__(*args):
89+
import os
90+
__dir__ = os.path.dirname(__file__)
91+
javafile = os.path.join(__dir__, "Image.java")
92+
with open(javafile, "w") as f:
93+
f.write(JAVA_CODE)
94+
os.system("javac " + javafile)
95+
96+
import java
97+
java.add_to_classpath(__dir__)
98+
global Image
99+
Image = java.type("Image")
100+
101+
102+
SZ = 20
103+
104+
105+
def measure(num):
106+
img = Image(SZ, SZ, list(range(SZ * SZ)))
107+
for i in range(num):
108+
img = img.sobel(True, True)
109+
return img
110+
111+
112+
def __benchmark__(num=10000):
113+
return measure(num)
114+
115+
116+
if __name__ == '__main__':
117+
import sys
118+
import time
119+
start = time.time()
120+
if len(sys.argv) >= 2:
121+
num = int(sys.argv[1])
122+
img = __benchmark__(num)
123+
else:
124+
img = __benchmark__(2)
125+
print(img.data)
126+
print("%s took %s s" % (__file__, time.time() - start))

0 commit comments

Comments
 (0)