123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- RIGAL RAPID PROGRAMMING GUIDE (W.E. 26.10.90)
- =============================
- Some considerations on fast Rigal execution and about
- some optimizations for recursive programs.
- Global algorithmic ideas :
- If your algorithm is tree-building - try use such ideas :
- 1.Every tree node accords to one call of Rigal rule
- 2.Next node is recursive call result (from previous rule),
- may be through some other rules.
- 3. Node is element of big array (list) and node refers to others
- by their "numbers of elements" in this array.
- 4. Tree (may be) not exist as data structure at execution
- time. Tree represented by tree-like history of execution
- of recursive rules."Good" nodes are accumulated in special list,
- or (more fast to search) in special another tree with well-chosen
- selectors. This way is good if tree building and tree traversing
- may be done in one pass.
- 5. Prepare all possible trees and tables in form of array or tree
- of arrays - before starting recursion. It helps to write
- cycles on lists , not on trees.
- 6. Use #CALL_PAS(60-66) - fast trees and lists.
- Local optimizations of programs.
- -------------------------------
- Don't use constructors in recursive called rule. It eats
- both time and memory.
- Operations in order of descending efficiency (from very slow to fast)
- as it is in compiled Rigal program.
- INEFFICIENT:
- ================
- SAVE; If SAVE is last statement in program -> it is implemented
- 1 1/2 times faster.
- LOAD
- #EXPLODE - very inefficient
- #IMPLODE
- FORALL $A IN $B - if $B is tree
- <* $A : $B *>
- $A !! $B - if $B is big list - elements copied one after one.
- $A ++ $B - if $B is big
- $A ++ $B - if $A is big
- $A:=<.D:E.> - every tree or list takes minimum 40 bytes
- $A:=(. D E .)
- #A ( $B $C ) - if call any rule with 2 or more parameters
- ( this will be optimized in nearest future )
- MIDDLE EFFICIENCY AND GOOD
- ==========================
- $A!.:=$K - if $A is small
- $A.$D:=$K
- $A++:=<. A:B, C:D, F:E.>
- $A!!(. A B C .)
- Arithmetical expressions
- $A.$B, $A[$B]
- $A.ABC $A[5]
- Patterns with constants.
- IMPLEMENTED VERY GOOD (in Pascal level):
- =======================================
- Clusters ( will be implemented in future )
- #CALL_PAS,#CHR, #ORD, predicates
- #LEN of tree or list
- #AA( $P1 $P2 $P3 $P4 ) - with one to four parameters
- FORALL $A IN $B - if $B is list
- $A+:=number
- $A !. $B
- IF/ELSE/FI, LOOP, BREAK , RETURN
- LAST #A $A
- $ $$
- $A:=$B;
- Single variable everywhere is of equal (or a
- little more) efficient as constant with the same value.
- ON PAGING CONTROL
- =================
- We recommend to use new #CALL_PAS(42) to know count
- of filled virtual memory pages in every N-th step
- of algorithm.
- Use #CALL_PAS(1) to require user to stop execution
- in every N-th step.
- If algorithm is iterative - use #CALL_PAS(45) to clean
- memory
- Every page is 8 KBytes.
- Totally is 256 pages ( 2 MBytes )
- In heap memory - no more than 50 pages,
- in 1300 Kb virtual disk - 170 pages
- in 300 Kb vitrual disk - 45 pages
- in hard disk - all remainder.
- One atom (or number) takes 8 bytes,
- One list of length N takes N*5 bytes, minimum 40
- One tree of length N takes N*10 bytes, minimum 40
|