Optimizing DFS in Data.Graph
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 25/100
- Tipo di issue
- Refactoring
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- haskell
- Ambito
- performance
Direzione di ricerca
Iniziate esaminando l’implementazione di dfs di Data.Graph e gli helper generate, prune e chop descritti nell’issue. Confrontate l’approccio dfsGraph proposto con dfs, topSort, scc e bcc, usando i benchmark elencati come riferimento. Il lavoro sarà completato quando saranno rimossi gli alberi intermedi non necessari, mantenendo al contempo gli algoritmi sui grafi interessati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
dfs is the core function in Data.Graph that all other algorithms (topSort, scc, bcc, etc) are based on. It takes a Graph and generates a [Tree Vertex].
dfs makes use of generate, prune and chop to generate a [Tree Vertex] and chop it into the returned [Tree Vertex].
Other functions further transform this [Tree Vertex], for example topSort flattens the [Tree Vertex] into a [Vertex].
These intermediate trees are unnecessary.
- The trees generated by
generateare immediately chopped into other trees. - For
topSort, the trees returned bydfsare immediately turned into a list.
There is no reason we need to create these trees in memory.
I propose combining the existing generate, prune, and chop function into a new core function that eliminates the intermediate trees from generate and also allows us to choose what to build from the DFS.
dfsGraph :: (Vertex -> a -> b) -> (b -> a -> a) -> a -> Graph -> [Vertex] -> a
Then we can define, for example
dfs = dfsGraph Node (:) []
topSort = dfsGraph <build the list directly>
Benchmarks on a random graph with 10,000 vertices and 100,000 edges:
dfs: OK (0.90s)
3.51 ms ± 79 μs, 57% less than baseline
topSort: OK (0.47s)
3.60 ms ± 107 μs, 59% less than baseline
Other function such as scc and bcc should also benefit, I've not implemented them yet.
Thoughts? I can clean up my code into a PR if this sounds good.
- Lingua principale
- Haskell
- Stelle
- 355
- Fork
- 194
- Merge medio
- 3g 4h
- PR unite (30g)
- 7
Preparare l'ambiente
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di haskell/containers
-
unfoldTree is too lazyApertamajor-release strictness Tree
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
haskell/containers#1260 ·
I maintainer di solito rispondono entro 1 giorno
-
IntSet low-hanging-fruit performance
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
haskell/containers#1251 ·
I maintainer di solito rispondono entro 1 giorno
-
maintainability major-release
Difficoltà 3/5 1-2 giorni Idoneità per principianti 70/100
haskell/containers#1250 ·
I maintainer di solito rispondono entro 1 giorno
-
PostOrder: foldl and foldr'Apertaperformance Tree
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
haskell/containers#1247 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 50/100
haskell/containers#1242 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di haskell/containers
Issue simili
-
bug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 84/100
alunduil/network-arbitrary#180 ·
I maintainer di solito rispondono entro 1 giorno
-
infrastructure
Difficoltà 1/5 1-3 ore Idoneità per principianti 65/100
alunduil/siren-json.hs#232 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
jgm/asciidoc-hs#14 ·
-
brick-3.0Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
commercialhaskell/stackage#8129 · 2 commenti ·