From aebfaf4aa084c491ee486ca63a4148ca0d4e3a3d Mon Sep 17 00:00:00 2001 From: "Martin.Otter@dlr.de" Date: Mon, 18 Apr 2022 20:49:46 +0200 Subject: [PATCH] Improved generation of sysimage --- Manifest.toml | 4 +- Project.toml | 3 +- create_Modia3D_sysimage.jl | 17 ++++- ...a3D_sysimage_precompile_statements_file.jl | 29 +++++++ docs/src/index.md | 5 ++ src/Modia3D.jl | 8 +- src/ModiatorServer.jl | 75 ++++++++++--------- test/Basic/ModelsForPrecompilation.jl | 30 ++++++++ test/Basic/Pendulum.jl | 4 +- test/includeTests.jl | 1 + 10 files changed, 126 insertions(+), 50 deletions(-) create mode 100644 create_Modia3D_sysimage_precompile_statements_file.jl create mode 100644 test/Basic/ModelsForPrecompilation.jl diff --git a/Manifest.toml b/Manifest.toml index fb79fedf..a948cceb 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -253,9 +253,9 @@ version = "0.8.6" [[deps.DoubleFloats]] deps = ["GenericLinearAlgebra", "LinearAlgebra", "Polynomials", "Printf", "Quadmath", "Random", "Requires", "SpecialFunctions"] -git-tree-sha1 = "58b203210416b70fc4f41eed1d55bfe876ef90db" +git-tree-sha1 = "da91494c1ebc1c057f21b6bef21e89ad5288c2c1" uuid = "497a8b3b-efae-58df-a0af-a86822472b78" -version = "1.2.0" +version = "1.2.1" [[deps.Downloads]] deps = ["ArgTools", "LibCURL", "NetworkOptions"] diff --git a/Project.toml b/Project.toml index a5c65c36..0ad6cac5 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ authors = ["Andrea Neumayr ", "Martin Otter ", "Gerhard Hippmann "] name = "Modia3D" uuid = "07f2c1e0-90b0-56cf-bda7-b44b56e34eed" -version = "0.10.3" +version = "0.10.4" [compat] Colors = "0.12, 0.11, 0.10" @@ -23,6 +23,7 @@ URIParser = "0.4" julia = "1.7" [deps] +Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" DoubleFloats = "497a8b3b-efae-58df-a0af-a86822472b78" diff --git a/create_Modia3D_sysimage.jl b/create_Modia3D_sysimage.jl index c493c31c..6b4ed84b 100644 --- a/create_Modia3D_sysimage.jl +++ b/create_Modia3D_sysimage.jl @@ -13,8 +13,9 @@ # module Create_Modia3D_sysimage -path = dirname(@__FILE__) -file = joinpath(path, "create_Modia3D_sysimage.jl") +path = dirname(@__FILE__) +file = joinpath(path, "create_Modia3D_sysimage.jl") +precompile_file = joinpath(path, "create_Modia3D_sysimage_precompile_statements_file.jl") Modia3D_sysimage_path = joinpath(pwd(), Sys.iswindows() ? "Modia3D_sysimage.dll" : "Modia3D_sysimage.so") import Pkg @@ -31,8 +32,18 @@ if length(addPackages) > 0 Pkg.add(addPackages) end +#= Seem to make startup slower +println("!!! Define additional artefacts for precompilation ...") +using Modia3D +usePlotPackage("PyPlot") +@usingModiaPlot +include("$path/test/Basic/ModelsForPrecompilation.jl") +=# + +# Create sysimage using PackageCompiler -create_sysimage(sysimage_path = Modia3D_sysimage_path) +create_sysimage(sysimage_path = Modia3D_sysimage_path, + precompile_statements_file = precompile_file) println("!!! Modia3D sysimage created. Use sysimage by starting julia with:") println(" julia -J$Modia3D_sysimage_path") diff --git a/create_Modia3D_sysimage_precompile_statements_file.jl b/create_Modia3D_sysimage_precompile_statements_file.jl new file mode 100644 index 00000000..ff49db63 --- /dev/null +++ b/create_Modia3D_sysimage_precompile_statements_file.jl @@ -0,0 +1,29 @@ +precompile(Tuple{typeof(Modia3D.ModiatorServer)}) +precompile(Tuple{typeof(Base.setindex!), Base.Dict{HTTP.Handlers.Route, Any}, Function, HTTP.Handlers.Route}) +precompile(Tuple{typeof(HTTP.Handlers.gh), String}) +precompile(Tuple{typeof(Base.println), Base.TTY}) +precompile(Tuple{typeof(HTTP.Servers.listen), Function, String, Int64}) +precompile(Tuple{typeof(HTTP.Servers.handle_connection), Function, HTTP.ConnectionPool.Connection{Sockets.TCPSocket}, HTTP.Servers.Server{Nothing, Sockets.TCPServer}, Int64, Int64}) +precompile(Tuple{typeof(Base.readuntil), HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, Function, Int64}) +precompile(Tuple{typeof(Base.alloc_buf_hook), Sockets.TCPSocket, UInt64}) +precompile(Tuple{typeof(Base.readuntil), Base.GenericIOBuffer{Array{UInt8, 1}}, typeof(HTTP.Parsers.find_end_of_header)}) +precompile(Tuple{typeof(Core.Compiler.convert), Type{DataType}, Type{Tuple{Union{Base.SubString{String}, String}, Int64}}}) +precompile(Tuple{Base.Cartesian.var"#@ncall", LineNumberNode, Module, Int64, Any, Vararg{Any}}) +precompile(Tuple{Type{Sundials.CVODE_BDF{Method, LinearSolver, P, PS} where PS where P where LinearSolver where Method}}) +precompile(Tuple{Type{Sundials.CVODE_BDF{:Newton, :Dense, Nothing, Nothing}}, Int64, Int64, Int64, Bool, Int64, Int64, Int64, Int64, Int64, Nothing, Nothing, Int64}) +precompile(Tuple{typeof(Base.hasfield), Type, Symbol}) +precompile(Tuple{typeof(Base.fieldindex), DataType, Symbol, Bool}) +precompile(Tuple{Type{Sundials.CVODE_BDF{:Newton, :GMRES, Nothing, Nothing}}, Int64, Int64, Int64, Bool, Int64, Int64, Int64, Int64, Int64, Nothing, Nothing, Int64}) +precompile(Tuple{typeof(HTTP.Handlers.handle), HTTP.Handlers.RequestHandlerFunction{typeof(Modia3D.simulateModel)}, HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}}) +precompile(Tuple{typeof(HTTP.ConnectionPool.hashconn), Type, String, String, Int64, Bool, Bool}) +precompile(Tuple{typeof(JSON.Parser.parse_object), JSON.Parser.ParserContext{Base.Dict{String, Any}, Int64, true, nothing}, JSON.Parser.MemoryParserState}) +precompile(Tuple{typeof(JSON.Parser.parse_string), JSON.Parser.MemoryParserState}) +precompile(Tuple{typeof(JSON.Parser.predict_string), JSON.Parser.MemoryParserState}) +precompile(Tuple{typeof(JSON.Parser.parse_string), JSON.Parser.MemoryParserState, Base.GenericIOBuffer{Array{UInt8, 1}}}) +precompile(Tuple{typeof(JSON.Parser.parse_number), JSON.Parser.ParserContext{Base.Dict{String, Any}, Int64, true, nothing}, JSON.Parser.MemoryParserState}) +precompile(Tuple{typeof(JSON.Parser.number_from_bytes), JSON.Parser.ParserContext{Base.Dict{String, Any}, Int64, true, nothing}, JSON.Parser.MemoryParserState, Bool, JSON.Parser.MemoryParserState, Int64, Int64}) +precompile(Tuple{typeof(JSON.Parser.hasleadingzero), JSON.Parser.MemoryParserState, Int64, Int64}) +precompile(Tuple{typeof(JSON.Parser.int_from_bytes), JSON.Parser.ParserContext{Base.Dict{String, Any}, Int64, true, nothing}, JSON.Parser.MemoryParserState, JSON.Parser.MemoryParserState, Int64, Int64}) +precompile(Tuple{typeof(Parsers.tryparse), Type{Float64}, Base.SubString{String}, Parsers.Options, Int64, Int64}) +precompile(Tuple{typeof(JSON.Parser.parse_jsconstant), JSON.Parser.ParserContext{Base.Dict{String, Any}, Int64, true, nothing}, JSON.Parser.MemoryParserState}) +precompile(Tuple{typeof(Modia3D.generateSimulationResult), Base.Dict{String, Any}}) diff --git a/docs/src/index.md b/docs/src/index.md index b5d05105..a8edca73 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -93,6 +93,11 @@ julia -JModia3D_sysimage.so (otherwise) ## Release Notes +### Version 0.10.4 + +- Script `Modia3D/create_Modia3D_sysimage.jl` improved. + + ### Version 0.10.3 - New script `Modia3D/create_Modia3D_sysimage.jl` to create a sysimage for a much faster startup diff --git a/src/Modia3D.jl b/src/Modia3D.jl index bdcc79d8..2ea87d12 100644 --- a/src/Modia3D.jl +++ b/src/Modia3D.jl @@ -4,7 +4,7 @@ module Modia3D const path = dirname(dirname(@__FILE__)) # Absolute path of package directory -const Version = "0.10.3" +const Version = "0.10.4" const Date = "2022-04-18" println("\nImporting Modia3D Version $Version ($Date)") @@ -156,7 +156,6 @@ function reenableRenderer() return nothing end - export PointGravityField, NoGravityField export print_ModelVariables @@ -167,8 +166,7 @@ export rereadContactPairMaterialFromJSON import StaticArrays import LinearAlgebra import Test -import JSON -import HTTP -import URIParser + +include("ModiatorServer.jl") end # module diff --git a/src/ModiatorServer.jl b/src/ModiatorServer.jl index 3947fe46..a88c42b4 100644 --- a/src/ModiatorServer.jl +++ b/src/ModiatorServer.jl @@ -1,21 +1,18 @@ -module ModiatorServer +export ModiatorServer -using Modia3D -using Modia3D.StaticArrays -using Modia3D.JSON -using Modia3D.HTTP -using Modia3D.URIParser -using Base64 # from Base +import JSON +import HTTP +import URIParser +using Base64 # ---------------------------------------------------------------------------------------- - function saveJSON(req) jsonString = String(req.body); index = findfirst("%25NAMEEND%25", jsonString); name = jsonString[1:index[1]-1] println("Saving ", name) jsonString = jsonString[index[end] + 1:end] - jsonString = unescape(jsonString) + jsonString = URIParser.unescape(jsonString) println(jsonString) io = open(string(name, ".json"), "w"); write(io, jsonString); @@ -48,7 +45,7 @@ function saveOBJ(req) name = objString[1:index[1]-1] println("Saving ", name) objString = objString[index[end] + 1:end] - objString = unescape(objString) + objString = URIParser.unescape(objString) io = open(string(name, ".obj"), "w"); write(io, objString); close(io) @@ -105,7 +102,7 @@ function simulateModel(req) return HTTP.Response(200, headers) end model = String(req.body); - model = unescape(model); + model = URIParser.unescape(model); experiment = JSON.parse(model); @time json = generateSimulationResult(experiment); # open("SimRes.txt", "w") do f @@ -116,7 +113,6 @@ function simulateModel(req) return response; end -@usingModiaPlot function generateSimulationResult(experiment) println() @@ -169,29 +165,36 @@ function unknownRequest(req) return HTTP.Response(200, "OK") end -const ROUTER = HTTP.Router() - -HTTP.@register(ROUTER, "POST", "/Modiator/simulateModel/", simulateModel) -HTTP.@register(ROUTER, "OPTIONS", "/Modiator/simulateModel/", simulateModel) - -HTTP.@register(ROUTER, "POST", "/Modiator/saveOBJ/", saveOBJ) -HTTP.@register(ROUTER, "POST", "/Modiator/loadOBJ/", loadOBJ) -HTTP.@register(ROUTER, "POST", "/Modiator/loadImageBase64/", loadImageBase64) -HTTP.@register(ROUTER, "POST", "/Modiator/saveJSON/", saveJSON) -HTTP.@register(ROUTER, "POST", "/Modiator/loadJSON/", loadJSON) -#HTTP.@register(ROUTER, "GET", "/Modiator/public/*", getPublic) -#HTTP.@register(ROUTER, "GET", "/Modiator/icons/*", getIcon) -HTTP.@register(ROUTER, "GET", "/*", unknownRequest) -HTTP.@register(ROUTER, "POST", "/*", unknownRequest) - -# println("Precompiling") -# precompile(generateSimulationResult, (Dict,)) -# precompile(HTTP.Router) -println("Server ready") -println("Listening to: 127.0.0.1:8000") -println() -println("Note that it might take more than 20 seconds for the first simulation to start.") +function ModiatorServer()::Nothing + ROUTER = HTTP.Router() + + HTTP.@register(ROUTER, "POST", "/Modiator/simulateModel/", simulateModel) + HTTP.@register(ROUTER, "OPTIONS", "/Modiator/simulateModel/", simulateModel) + + HTTP.@register(ROUTER, "POST", "/Modiator/saveOBJ/", saveOBJ) + HTTP.@register(ROUTER, "POST", "/Modiator/loadOBJ/", loadOBJ) + HTTP.@register(ROUTER, "POST", "/Modiator/loadImageBase64/", loadImageBase64) + HTTP.@register(ROUTER, "POST", "/Modiator/saveJSON/", saveJSON) + HTTP.@register(ROUTER, "POST", "/Modiator/loadJSON/", loadJSON) + #HTTP.@register(ROUTER, "GET", "/Modiator/public/*", getPublic) + #HTTP.@register(ROUTER, "GET", "/Modiator/icons/*", getIcon) + HTTP.@register(ROUTER, "GET", "/*", unknownRequest) + HTTP.@register(ROUTER, "POST", "/*", unknownRequest) + + # println("Precompiling") + # precompile(generateSimulationResult, (Dict,)) + # precompile(HTTP.Router) + println("Server ready") + println("Listening to: 127.0.0.1:8000") + println() + println("Note that it might take more than 20 seconds for the first simulation to start.") + + HTTP.serve(ROUTER, "127.0.0.1", 8000) + return nothing +end -HTTP.serve(ROUTER, "127.0.0.1", 8000) +function julia_main()::Cint + ModiatorServer() + return 0 +end -end \ No newline at end of file diff --git a/test/Basic/ModelsForPrecompilation.jl b/test/Basic/ModelsForPrecompilation.jl new file mode 100644 index 00000000..20e52016 --- /dev/null +++ b/test/Basic/ModelsForPrecompilation.jl @@ -0,0 +1,30 @@ +module ModelsForPrecompilation + +using Modia3D + +Dummy = Model3D( + world = Object3D(feature=Scene(provideAnimationHistory=true, enableVisualization=false, + enableContactDetection=true, + gravityField=UniformGravityField(g=9.81, n=[0, -1, 0]))), + + body1 = Object3D(feature=Solid(shape=Beam(axis=1, length=1.0, width=0.1, thickness=0.1), + solidMaterial="Aluminium")), + frame1 = Object3D(parent=:body1, translation=[-0.5, 0.0, 0.0]), + rev = Revolute(obj1=:world, obj2=:frame1), + + body2 = Object3D(feature=Solid(shape=Box(lengthX=1.0, lengthY=0.1, lengthZ=0.1), massProperties=MassProperties(mass=1.0))), + prism = Prismatic(obj1=:world , obj2=:body2, axis=2), + + body3 = Object3D(feature=Solid(shape=Sphere(diameter=0.2), + visualMaterial=VisualMaterial(color="Blue"), + solidMaterial="Steel", + massProperties=MassPropertiesFromShapeAndMass(mass=0.001), + collision=true)), + free = FreeMotion(obj1=:world, obj2=:body3, r=Var(init=Modia.SVector{3,Float64}(0.0, 1.0, 0.0)), + w=Var(init=Modia.SVector{3,Float64}(10.0, 0.0, -5.0))) +) + +dummy = @instantiateModel(Dummy, unitless=true) +simulate!(dummy, stopTime=0.001, interval=0.001) + +end diff --git a/test/Basic/Pendulum.jl b/test/Basic/Pendulum.jl index 517582a3..ce5c74b5 100644 --- a/test/Basic/Pendulum.jl +++ b/test/Basic/Pendulum.jl @@ -1,8 +1,6 @@ module PendulumModule -using Modia -import Modia3D -using Modia3D.ModiaInterface +using Modia3D Pendulum = Model3D( world = Object3D(feature=Scene()), diff --git a/test/includeTests.jl b/test/includeTests.jl index 9527eea7..1d796699 100644 --- a/test/includeTests.jl +++ b/test/includeTests.jl @@ -5,6 +5,7 @@ Modia3D.loadPalettes!(solidMaterialPalette = "$(Modia3D.path)/palettes/sol visualMaterialPalette = "$(Modia3D.path)/palettes/visualMaterials.json") Test.@testset "Basic" begin + include(joinpath("Basic", "ModelsForPrecompilation.jl")) include(joinpath("Basic", "AllShapes.jl")) include(joinpath("Basic", "PendulumWithBar1.jl")) include(joinpath("Basic", "PendulumWithBar2.jl"))