
    #)diJ$                         d Z ddlZddlZddlZddlZddlmZmZ d Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Z G d de          ZdZddZedk    r& ej         eej        dd                              dS )a  Benchmarking.

Run each test 3 times and get median value.
Using 10K array as base test time.

Each other test compared with base with next formula::

         Tc * Nb
    q = ---------
         Tb * Nc

Here:

* Tc - execution time of current test
* Tb - execution time of base
* Nb - array size of base (10K)
* Nc - array size of current test

If resulting value is ``q <= 1.0`` it's the best possible result,
i.e. time increase proportionally to array size.
    N)StringIOrange_gc                 x    |                                   t          t          |           dz            }| |         S )zReturn median value for the list of values.
    @param  values:     list of values for processing.
    @return:            median value.
       )sortintlen)valuesns     U/var/www/menimich/repos/protonApp/venv/lib/python3.11/site-packages/intelhex/bench.pymedianr   %   s2    
 KKMMMCKK!OA!9    c                     t          j                     	 t          j                    } | |           t          j                    }t          j                     n# t          j                     w xY w||z
  S )zRun func with argument fobj and measure execution time.
    @param  func:   function for test
    @param  fobj:   data for test
    @return:        execution time
    )gcdisabletimeenable)funcfobjbeginends       r   run_testr   .   s^     JLLL	T


ikk
		;s   1A A/c                     |dk    sJ g }t          |          D ]H}t          |          }|                    t          | |                     |                                 It          |          }||fS )zRun each test N times.
    @param  func:   function for test
    @param  hexstr: string with content of hex file to read
    @param  n:      times to repeat.
    @return:        (median time, times list)
    r   r   r   appendr   closer   )r   hexstrr   timesisiots          r   run_readtest_N_timesr"   =   sw     q5555EQZZ  vXdC(()))		uAe8Or   c                     |dk    sJ g }t          |          D ]G}t                      }|                    t          | |                     |                                 Ht          |          }||fS )zRun each test N times.
    @param  func:   function for test
    @param  n:      times to repeat.
    @return:        (median time, times list)
    r   r   )r   r   r   r   r    r!   s         r   run_writetest_N_timesr$   M   ss     q5555EQZZ  jjXdC(()))		uAe8Or   c                     t          |           } t          |          }t          |          }t          |          }| |z  ||z  z  }|S )zReturn time coefficient relative to base numbers.
    @param  tc:     current test time
    @param  nc:     current test data size
    @param  tb:     base test time
    @param  nb:     base test data size
    @return:        time coef.
    )float)tcnctbnbqs        r   	time_coefr,   \   sG     
rB	rB	rB	rB	bR"WAHr   c                 X   t          j                    }d}t          |           D ]}|dz  ||<   |dz  }||z  }t          |          D ]}|dz  ||<   |dz  }t                      }|                    |           |                                }|                                 | |z   ||fS )a  Create test data on given pattern.
    @param  n1:     size of first part of array at base address 0.
    @param  offset: offset for second part of array.
    @param  n2:     size of second part of array at given offset.
    @return:        (overall size, hex file, IntelHex object)
    r         )intelhexIntelHexr   r   write_hex_filegetvaluer   )n1offsetn2ihaddrr   r    r   s           r   get_test_datar9   k   s     
			BDR[[  #:4	FNDR[[  #:4	
**Cc\\^^FIIKKKb5&"r   c                  $    t          ddd          S )NiP  r   r9    r   r   get_base_50Kr=      s    1%%%r   c                  $    t          ddd          S )Ni r   r;   r<   r   r   get_250Kr?      s    A&&&r   c                  $    t          ddd          S )N順 @B r;   r<   r   r   get_100K_100KrC      s    &111r   c                  $    t          ddd          S )Nr   rB   rA   r;   r<   r   r   
get_0_100KrE      s    GV,,,r   c                  $    t          ddd          S )NrB   r   r;   r<   r   r   get_1MrG      s    !Q'''r   c                   P    e Zd ZdZdefdefdefdefdefgZ	dd	Z
d
 Zd ZddZdS )MeasurezMeasure execution time helper.zbase 50K250K1Mz	100K+100Kz0+100K   Tc                 >    || _         || _        || _        g | _        d S N)r   readwriteresults)selfr   rO   rP   s       r   __init__zMeasure.__init__   s"    	
r   c                     |\  }}}d\  }}| j         r&t          t          j        || j                  d         }| j        r t          |j        | j                  d         }||fS )zDo measuring of read and write operations.
        @param  data:   3-tuple from get_test_data
        @return:        (time readhex, time writehex)
        )        rU   r   )rO   r"   r0   r1   r   rP   r$   r2   )rR   data_unusedr   r7   treadtwrites          r   measure_onezMeasure.measure_one   sm    
 # v9 	O():FDFKKANE: 	I*2+<dfEEaHFf}r   c                     | j         D ]G\  }} |            }|                     |          }| j                            |||d         f           Hd S )Nr   )data_setrZ   rQ   r   )rR   namegetterrV   r   s        r   measure_allzMeasure.measure_all   sc     M 	8 	8LD&688D$$T**ELud1g 67777	8 	8r   Nc                    |t           j        }| j        d         \  }}}|\  }}d||fz  g}d||fz  g}| j        dd          D ]u}	|	\  }
}}|\  }}| j        r-t	          ||||          }|                    d|
||fz             | j        r-t	          ||||          }|                    d|
||fz             v| j        rR|                    d           |                    d                    |                     |                    d           | j        rT|                    d           |                    d                    |                     |                    d           d S d S )	Nr   z%-10s	%7.3fr/   z%-10s	%7.3f	%7.3fzRead operation:

z

zWrite operation:
)sysstdoutrQ   rO   r,   r   rP   join)rR   to_file
base_title
base_timesbase_n	base_read
base_writeread_reportwrite_reportitem	cur_title	cur_timescur_ncur_read	cur_writeqreadqwrites                    r   print_reportzMeasure.print_report   s   ?jG)-a&
J *	:%Y(??@&*j)AABL$ 	E 	ED*.'Iy%"+Hiy C!(E"+V5 5""#8I;C;@<B $B C C C z E"9e#-v7 7##$9Y<E<B=D %D E E E 9 	"MM-...MM$))K00111MM&!!!: 	"MM.///MM$))L11222MM&!!!!!	" 	"r   )rL   TTrN   )__name__
__module____qualname____doc__r=   r?   rG   rC   rE   r\   rS   rZ   r_   ru   r<   r   r   rI   rI      s        (( 
\"		v	m$	:
H     8 8 8" " " " " "r   rI   a  Usage: python _bench.py [OPTIONS]

Options:
    -h      this help
    -n N    repeat tests N times
    -r      run only tests for read operation
    -w      run only tests for write operation

If option -r or -w is not specified then all tests will be run.
c                 ^   ddl }d}d}d}| t          j        dd         } 	 |                     | dg           \  }}|D ]I\  }}|dk    rt          t                      dS |dk    rt          |          }8|dk    rd	}A|d
k    rd	}J|r|                    d          nH# |j        $ r; t          j                    d         }	t          |	          }
t          |
           Y dS w xY w||fdk    rd	x}}t          |||          }|
                                 |                                 dS )zzMain function to run benchmarks.
    @param  argv:   command-line arguments.
    @return:        exit code (0 is OK).
    r   NrL   r/   zhn:rwz-hz-nz-rTz-wzArguments are not used.)NN)getoptrb   argvprintHELPr   GetoptErrorexc_infostrrI   r_   ru   )r|   r{   	test_read
test_writer   optsargsoamsgtxtms               r   mainr      sq   
 MMM IJ	A|x|]]4"55
d 		" 		"CAaDyydqqdFFd 		d!
 	@$$%>???	@   lnnQ#hhc


qq	 	:,..!%%	J9j))AMMOOONN1s   <B   ?B   AC%$C%__main__r/   rN   )ry   r   rb   r   r0   intelhex.compatr   r   r   r   r"   r$   r,   r9   r=   r?   rC   rE   rG   objectrI   r~   r   rv   exitr|   r<   r   r   <module>r      s   , 
			 



   - - - - - - - -             2& & &' ' '2 2 2- - -( ( (D" D" D" D" D"f D" D" D"N
, , , ,^ zCHTT#(122,   M Mr   