Skip to content
This repository was archived by the owner on Nov 7, 2025. It is now read-only.

Commit e89b5ee

Browse files
Merge pull request #5 from vovak/performance_test
Performance test
2 parents ac618f3 + dca6959 commit e89b5ee

File tree

20 files changed

+124
-10
lines changed

20 files changed

+124
-10
lines changed

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ task processPyExample(type: JavaExec) {
4848
classpath = sourceSets.main.runtimeClasspath
4949
}
5050

51+
task performanceTest(type: JavaExec) {
52+
main = 'miningtool.performance.PerformanceTest'
53+
classpath = sourceSets.main.runtimeClasspath
54+
}
55+
5156
antlr4 {
5257
source = file('antlr')
5358
output = file('src/main/generated/me/vovak/antlr/parser')

src/main/kotlin/miningtool/examples/AllJavaFiles.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import java.io.File
99

1010
//Retrieve paths from Java files, using a generated parser.
1111
fun allJavaFiles() {
12-
val folder = "./testData"
12+
val folder = "./testData/examples/"
1313

1414
val miner = PathMiner(PathRetrievalSettings(5, 5))
1515
val storage = VocabularyPathStorage()

src/main/kotlin/miningtool/examples/AllJavaFilesGumTree.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import java.io.File
99

1010
//Retrieve paths from Java files, using a GumTree parser.
1111
fun allJavaFilesGumTree() {
12-
val folder = "./testData"
12+
val folder = "./testData/examples/"
1313

1414
val miner = PathMiner(PathRetrievalSettings(5, 5))
1515
val storage = VocabularyPathStorage()

src/main/kotlin/miningtool/examples/AllJavaMethods.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ private fun getCsvFriendlyMethodId(methodInfo: MethodInfo?): String {
2020
//Retrieve paths from all Java files, using a GumTree parser.
2121
//GumTreeMethodSplitter is used to extract individual method nodes from the compilation unit tree.
2222
fun allJavaMethods() {
23-
val folder = "./testData"
23+
val folder = "./testData/examples/"
2424

2525
val miner = PathMiner(PathRetrievalSettings(5, 5))
2626

src/main/kotlin/miningtool/examples/AllPythonFiles.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import java.io.File
99

1010

1111
fun allPythonFiles() {
12-
val folder = "./testData"
12+
val folder = "./testData/examples/"
1313

1414
val miner = PathMiner(PathRetrievalSettings(5, 5))
1515
val storage = VocabularyPathStorage()

src/main/kotlin/miningtool/parse/antlr/java/Java8Parser.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ import java.io.InputStream
1212
class Java8Parser : Parser<SimpleNode> {
1313
override fun parse(content: InputStream): SimpleNode? {
1414
val lexer = JavaLexer(ANTLRInputStream(content))
15+
lexer.removeErrorListeners()
1516
val tokens = CommonTokenStream(lexer)
1617
val parser = JavaParser(tokens)
18+
parser.removeErrorListeners()
1719
val context = parser.compilationUnit()
1820
return convertAntlrTree(context, JavaParser.ruleNames)
1921
}

src/main/kotlin/miningtool/parse/antlr/python/PythonParser.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ import java.io.InputStream
1212
class PythonParser : Parser<SimpleNode> {
1313
override fun parse(content: InputStream): SimpleNode? {
1414
val lexer = Python3Lexer(ANTLRInputStream(content))
15+
lexer.removeErrorListeners()
1516
val tokens = CommonTokenStream(lexer)
1617
val parser = Python3Parser(tokens)
18+
parser.removeErrorListeners()
1719
val context = parser.file_input()
1820
return convertAntlrTree(context, Python3Parser.ruleNames)
1921
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
@file:JvmName("PerformanceTest")
2+
3+
package miningtool.performance
4+
5+
import miningtool.common.Node
6+
import miningtool.common.Parser
7+
import miningtool.common.toPathContext
8+
import miningtool.parse.antlr.java.Java8Parser
9+
import miningtool.parse.antlr.python.PythonParser
10+
import miningtool.paths.PathMiner
11+
import miningtool.paths.PathRetrievalSettings
12+
import miningtool.paths.storage.VocabularyPathStorage
13+
import java.io.File
14+
import java.lang.IllegalStateException
15+
16+
fun <NodeType : Node, LangParser : Parser<NodeType>> langPerformanceTest(language: String,
17+
langSuffix: String,
18+
parser: LangParser,
19+
retrievalSettings: PathRetrievalSettings) {
20+
val startTime = System.currentTimeMillis()
21+
22+
println("Running performance test for $language")
23+
24+
val folder = "./testData/performanceTest/$langSuffix/"
25+
println("Using files in $folder")
26+
27+
val miner = PathMiner(retrievalSettings)
28+
val storage = VocabularyPathStorage()
29+
30+
var filesNumber = 0L
31+
var filesFailed = 0L
32+
var locNumber = 0L
33+
var parsingElapsedTime = 0L
34+
var retrievingElapsedTime = 0L
35+
var storingElapsedTime = 0L
36+
37+
File(folder).walkTopDown().filter { it.path.endsWith(".$langSuffix") }.forEach { file ->
38+
try {
39+
var currentTime = System.currentTimeMillis()
40+
val node = parser.parse(file.inputStream())
41+
parsingElapsedTime += System.currentTimeMillis() - currentTime
42+
if (node == null) return@forEach
43+
44+
currentTime = System.currentTimeMillis()
45+
val paths = miner.retrievePaths(node)
46+
retrievingElapsedTime += System.currentTimeMillis() - currentTime
47+
48+
currentTime = System.currentTimeMillis()
49+
storage.store(paths.map { toPathContext(it) }, entityId = file.path)
50+
storingElapsedTime += System.currentTimeMillis() - currentTime
51+
52+
// If parsing is successful
53+
filesNumber++
54+
locNumber += file.readLines().size
55+
} catch (e: IllegalStateException) {
56+
println("Unable to parse ${file.path}")
57+
filesFailed++
58+
}
59+
}
60+
61+
val currentTime = System.currentTimeMillis()
62+
storage.save("out_examples/performanceTest$language")
63+
storingElapsedTime += System.currentTimeMillis() - currentTime
64+
65+
println("Performance test took ${(System.currentTimeMillis() - startTime) / 1000} sec")
66+
println("Processed $filesNumber files, $locNumber lines of code")
67+
println("Failed to parse $filesFailed files")
68+
println()
69+
println("Parsing overall time: ${parsingElapsedTime / 1000} sec")
70+
println("Parsing speed: ${filesNumber * 1000 / parsingElapsedTime} files/sec, " +
71+
"${locNumber * 1000 / parsingElapsedTime} loc/sec")
72+
println()
73+
println("Path retrieval overall time: ${retrievingElapsedTime / 1000} sec")
74+
println("Path retrieval speed: ${filesNumber * 1000 / retrievingElapsedTime} files/sec, " +
75+
"${locNumber * 1000 / retrievingElapsedTime} loc/sec")
76+
println()
77+
println("Storing overall time: ${storingElapsedTime / 1000} sec")
78+
println("Storing speed: ${filesNumber * 1000 / storingElapsedTime} files/sec, " +
79+
"${locNumber * 1000 / storingElapsedTime} loc/sec")
80+
println()
81+
}
82+
83+
fun main(args: Array<String>) {
84+
val retrievalSettings = PathRetrievalSettings(5, 5)
85+
langPerformanceTest("Python", "py", PythonParser(), retrievalSettings)
86+
langPerformanceTest("Java", "java", Java8Parser(), retrievalSettings)
87+
}

src/test/kotlin/miningtool/parse/antlr/python/ANTLRPythonParserTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class ANTLRPythonParserTest {
1010
@Test
1111
fun testNodeIsNotNull() {
1212
val parser = PythonParser()
13-
val file = File("testData/1.py")
13+
val file = File("testData/examples/1.py")
1414

1515
val node = parser.parse(FileInputStream(file))
1616
Assert.assertNotNull("Parse tree for a valid file should not be null", node)

src/test/kotlin/miningtool/parse/java/GumTreeJavaParserTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class GumTreeJavaParserTest {
88
@Test
99
fun testNodeIsNotNull() {
1010
val parser = GumTreeJavaParser()
11-
val file = File("testData/1.java")
11+
val file = File("testData/examples/1.java")
1212

1313
val node = parser.parse(FileInputStream(file))
1414
Assert.assertNotNull("Parse tree for a valid file should not be null", node)

0 commit comments

Comments
 (0)