Comments (9)
Nieuwe tijdsmetingen met de ideeën van hierboven. De tabellen tonen eerst de lotto-oefening (zelfde als hierboven, eerste twee metingen zijn dan ook die van hierboven). Daarna volgt een echo-oefening, waarbij geen custom evaluator gebruikt wordt (deze is enkel in de huidige implementatie getest). Beschrijvingen van de modi staan onder de tabellen. In het vet de uiteindelijke uitvoeringstijden, zoals ze gebruikt worden door de judge in Dodona.
Java
1 thread | 4 threads | ||
---|---|---|---|
LOTTO | volledig | 48s | 36s |
partieel | 46s | 25s | |
verbeterd | 14s | 10s | |
ECHO | verbeterd | 8s | 5s |
Python
1 thread | 4 threads | ||
---|---|---|---|
LOTTO | volledig | 13s | 9s |
partieel | 9s | 6s | |
verbeterd | 8s | 6s | |
ECHO | verbeterd | 5s | 3s |
Beschrijving
- Volledig: elke context afzonderlijk gecompileerd en uitgevoerd.
- Partieel: gemeenschappelijke code een keer gecompileerd,
elke context afzonderlijk gecompileerd en uitgevoerd. - Verbeterd: alle code een keer gecompileerd, elke context
afzonderlijk uitgevoerd.
Bij de verbeterde modus is het idee om custom evaluatoren in Python met exec
uit te voeren nog niet geïmplementeerd. Dit idee kan het verschil tussen de lotto- en echo-oefening misschien een beetje kleiner maken.
from universal-judge.
Volgende zaken zijn geïmplementeerd:
- Parallelle uitvoering van de contexten
- Mogelijkheid tot compilatie van gemeenschappelijke code
Voor de momenteel geïmplementeerde talen is het als volgt geïmplementeerd:
- Python
- Submission & serialisatie worden op voorhand gecompileerd naar
pyc
-bestanden, die dan naar de contextmap gekopieerd worden - Per context wordt de code gewoon uitgevoerd, met het idee dat het hier niet nuttig is om eerst te compileren.
- Submission & serialisatie worden op voorhand gecompileerd naar
- Java
- Submisson & serialisatie worden op voorhand gecompileerd naar
class
-bestanden, die naar de contextmap gekopieerd worden - Per context wordt de rest van de code gecompileerd en dan uitgevoerd
- Submisson & serialisatie worden op voorhand gecompileerd naar
- Haskell
- Submission & serialisatie worden op voorhand gecompileerd, maar het resultaat wordt nog niet herbruikt
- Per context wordt de code uitgevoerd met
runhaskell
. Op termijn is het misschien een idee om aan de hand van bv. de maximale uitvoeringstijd voor de oefening over te gaan op compilatie.
from universal-judge.
@niknetniko hoe groot is de tijdswinst door parallellisatie en recup van compilatie voor Python en Java? grosso modo is OK
from universal-judge.
@pdawyndt Deze tests zijn uitgevoerd met de lotto-oefening.
Legenda
Bij de kolom threads staat V voor volledig en P voor partieel (i.e. zonder en met precompilatie van gemeenschappelijke code)
Python
Threads* | Tijd (s) | Percentage |
---|---|---|
1V | 13 | 100% |
4V | 9 | 69% |
1P | 9 | 69% |
4P | 6 | 46% |
Java
Threads* | Tijd (s) | Percentage |
---|---|---|
1V | 48 | 100% |
4V | 36 | 75% |
1P | 46 | 95% |
4P | 27 | 56% |
Merk op dat ze niet uitgevoerd zijn in Dodona, maar manueel (uitvoeren in Dodona voegt nog wat overhead toe).
from universal-judge.
@niknetniko de duur van alle testen blijft toch nog behoorlijk lang :-(
ter mijner info: gebruik je bij het testen een custom judge die de uitvoering meerdere keren doet om ook te kunnen testen of alle mogelijkheden gekozen worden, of is dit nog een testplan waarbij de custom judge enkel de correctheid van één enkele uitvoering van elke function call beoordeelt?
omdat de custom judge natuurlijk ook nog een overhead heeft, zou het misschien ook interessant zijn om eens timings te doen van een oefening zonder custom judge, bv. echo want die heeft qua uitvoer van de studentencode natuurlijk weinig overhead
from universal-judge.
de duur van alle testen blijft toch nog behoorlijk lang :-(
Helaas wel
Dit is met een custom judge, maar er wordt wel maar 1 keer uitgevoerd.
Een idee waar ik nu naar kijk is om te proberen geen compilatiestap te moeten doen bij elke context, door alle code voor alle contexten in één bestand te genereren. Dat zou dan 1 keer gecompileerd worden, en "at runtime" zou dan de juiste code geselecteerd worden (concreet door het nummer van de context mee te geven als parameter). Dit zou vooral voor Java nuttig zijn denk ik.
Anderzijds is er waarschijnlijk ook nog mogelijkheid tot optimaliseren bij de custom judges, aangezien ik daar nog niets heb geoptimaliseerd.
Ik zal kijken om eens een tijdsmeeting te doen met een echo-oefening om de impact van de custom judge te zien.
from universal-judge.
Verschil tussen single en multithreaded uitvoer is niet zo groot. Is dat omdat de "compilatiefase" het grootste deel van de tijd inneemt, en die stap inherent sequentieel is. Misschien de moeite om die twee fasen eens afzonderlijk te timen.
from universal-judge.
Custom evaluatoren kunenn in principe ook al op voorhand gecompileerd worden, dus één keer per wijziging aan de oefeningen, in plaats van telkens opnieuw per ingediende oplossing.
from universal-judge.
Ik heb toekomstige dingen opgenomen als future work, ik denk niet dat hier nog dingen te doen zijn.
from universal-judge.
Related Issues (20)
- TESTed doesn't copies additional source files on batch compilation
- Support of generic types
- Support namespaces for function calls
- Java tracebacks expose some TESTed internals HOT 1
- Broken link from traceback to code line HOT 3
- Render linter messages as HTML HOT 1
- Support multiline stdout in code samples of template descriptions HOT 1
- Add numpy to docker container HOT 1
- Directly support heap package for JavaScript HOT 1
- Support large numbers
- Conditional statements for specific programming language don't work
- Haskell compile options -O2
- Render Haskell arguments without brackets HOT 1
- Better dependency management
- Add formatter for TESTed
- Rename "rational" to "real"
- Rename test plan to test suite
- Add support for C# HOT 1
- Show prompt character for main calls
- Don't cast integers in C#
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from universal-judge.