At a glance, why don't I have better performances between Julia and PHP?

Hi everyone!

I manage an automatic warehouse, where there are trays with a certain number of items inside. I was trying to do a count with Julia, elaborating some csv files that I export from my management and that represent precisely the trays and their internal items.

The concept of the calculation is this: on a csv I have a tray for each row, on another csv I have a single cell of the tray for each row, which may or may not contain an article … and so, scrolling through the csv, I believe myself to be a dictionary where for each tray I count the number of cells with an article inside, and empty cells, so that I know how many trays there are with some article, or all empty, or all full. A simple count, there is nothing math except addition … :smiley:

I would like to know what kind of defects the script I have made, since I had the idea of converting it to php, and running it from the command line (I have a windows 7 i5) I see more or less equal calculation times between julia and php … I don’t really understand, I expected to see the php equivalent spin much slower … what kind of mistakes do you think I could have made, such as to knock down the performances in this way?.

Many thanks to everyone for the tips.

This is my Julia script echo (elapsed time at the end of it):

c:\prg\julia>ptime julia robot2.jl

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

===  julia robot2.jl ===
Calcolo dizionario id locazione / fila ...
Calcolo dizionario nr vassoio / fila ...
Calcolo  ...
Calcolo finale  ...
nr totale vassoi ubicati = 1734
========================================

NumerositĂ  totali e per fila   : totali         fila1           fila2           fila3           fila4
NumerositĂ  vassoi con qualcosa : 583            128             164             113             178
NumerositĂ  vassoi tutti pieni  : 474            150             189             72              63
NumerositĂ  vassoi tutti vuoti  : 677            177             129             221             150

Execution time: 0.902 s

c:\prg\julia>

And this one is the echo from php (again , elapsed time at the end of it)::


c:\xampp\htdocs\robot>ptime php index.php

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

===  php index.php ===

Calcolo dizionario id locazione / fila ...
Calcolo dizionario nr vassoio / fila ...
Calcolo  ...
Calcolo finale  ...
nr totale vassoi ubicati = 1734n========================================
NumerositĂ  totali e per fila   : totali         fila1           fila2           fila3           fila4
NumerositĂ  vassoi con qualcosa : 583            128             164             113             178
NumerositĂ  vassoi tutti pieni  : 474            150             189             72              63
NumerositĂ  vassoi tutti vuoti  : 677            177             129             221             150
Execution time: 0.758 s

c:\xampp\htdocs\robot>

The Julia code is this one:

folderInput ="c:/vmswap/robot/tabelle"
folderOutput ="c:/vmswap/robot/"

function daFileAdArray(nomeTabella)
    fn = folderInput  * "/" * nomeTabella
    st = open(fn) do file
        read(file, String)
    end
    rows = split(st, "\r\n") 
    deleteat!(rows,1); #cancello prima riga nome campi
    return rows
end 

ubicazioni = daFileAdArray("TAUTOMAGLOC.TXT")
testaVassoi = daFileAdArray("TAUTOMAGVAS.TXT")
internoVassoi = daFileAdArray("TAUTOMAGVASDETT.TXT")

# cross vassoi ubicazioni
println("Calcolo dizionario id locazione / fila ...")
dictIdLocazioneFila= Dict()
for row in ubicazioni
    if row>" "
       s = split(row,";")   
       idLocazione = s[1]  
       ubicazione = s[8]
       ubicaziones = split(ubicazione,".")
       fila=ubicaziones[3]
       dictIdLocazioneFila[idLocazione]=fila 
    end
end
println("Calcolo dizionario nr vassoio / fila ...")
dictVassoioFila = Dict()
for row in testaVassoi
    if row>" "
       s = split(row,";")   
       nrVassoio = s[1]  
       idLocazione = s[4]
       if haskey(dictIdLocazioneFila, idLocazione)     
         fila = dictIdLocazioneFila[ idLocazione ]
         dictVassoioFila[nrVassoio]=fila
       end
    end
end

println("Calcolo  ...")
# ---------------------------------
indiceMasterSuSlave = 2
nrCellePerVassoio = Dict();  
for row in internoVassoi
    if row>" "          
        s = split(row,";")
        codiceArticolo = s[4]
             
        nrVassoio = s[indiceMasterSuSlave]   
        
        if haskey(dictVassoioFila, nrVassoio)     
            fila = dictVassoioFila[nrVassoio]  
          

            if haskey(nrCellePerVassoio, nrVassoio)      
                nrTotali, nrPiene, nrVuote = nrCellePerVassoio[ nrVassoio ]                 
            else           
                nrTotali, nrPiene, nrVuote = [0,0,0]  
            end    
            nrTotali = nrTotali + 1
            
            if codiceArticolo > ""
                nrPiene = nrPiene + 1
                  
            else
                nrVuote = nrVuote + 1        
            end
            
            nrCellePerVassoio[ nrVassoio ] = [nrTotali,nrPiene,nrVuote]   
        end    
    end
end

# ---------------------------------
println("Calcolo finale  ...") 
vassoi= copy([])

for row in testaVassoi
    s = split(row,";")
    nrVassoio = s[1]
    if haskey(nrCellePerVassoio, nrVassoio)
       
            #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
            #print( nrVassoio, ", "  )
            push!(vassoi,nrVassoio )
      
    end
end
println("nr totale vassoi ubicati = " , length(vassoi))
println("========================================") 

# ---------------------------------
 
vassoiConQualcosa = copy([])
vassoiTuttiPieni = copy([])
vassoiTuttiVuoti = copy([])

vassoiConQualcosa_1 = copy([])
vassoiTuttiPieni_1 = copy([])
vassoiTuttiVuoti_1 = copy([])

vassoiConQualcosa_2 = copy([])
vassoiTuttiPieni_2 = copy([])
vassoiTuttiVuoti_2 = copy([])

vassoiConQualcosa_3 = copy([])
vassoiTuttiPieni_3 = copy([])
vassoiTuttiVuoti_3 = copy([])

vassoiConQualcosa_4 = copy([])
vassoiTuttiPieni_4 = copy([])
vassoiTuttiVuoti_4 = copy([])

for row in testaVassoi
    s = split(row,";")
    nrVassoio = s[1]
    if haskey(nrCellePerVassoio, nrVassoio)
        valoriPerVassoio =  nrCellePerVassoio[ nrVassoio ] 
        filaVassoio = dictVassoioFila[nrVassoio]
        if (valoriPerVassoio[2] > 0) && (!(valoriPerVassoio[1] == valoriPerVassoio[2]) )
            #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
            #print( nrVassoio, ", "  )
            push!(vassoiConQualcosa,nrVassoio )

            if filaVassoio == "F01"
                push!(vassoiConQualcosa_1,nrVassoio )
            end
            if filaVassoio == "F02"
                push!(vassoiConQualcosa_2,nrVassoio )
            end
            if filaVassoio == "F03"
                push!(vassoiConQualcosa_3,nrVassoio )
            end
            if filaVassoio == "F04"
                push!(vassoiConQualcosa_4,nrVassoio )
            end


        end
        if valoriPerVassoio[2] == 0
            #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
            #print( nrVassoio, ", "  )
            push!(vassoiTuttiVuoti,nrVassoio )
            if filaVassoio == "F01"
                push!(vassoiTuttiVuoti_1,nrVassoio )
            end
            if filaVassoio == "F02"
                push!(vassoiTuttiVuoti_2,nrVassoio )
            end
            if filaVassoio == "F03"
                push!(vassoiTuttiVuoti_3,nrVassoio )
            end
            if filaVassoio == "F04"
                push!(vassoiTuttiVuoti_4,nrVassoio )
            end            
        end          
        if valoriPerVassoio[2] == valoriPerVassoio[1]
            #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
            #print( nrVassoio, ", "  )
            push!(vassoiTuttiPieni,nrVassoio )
            if filaVassoio == "F01"
                push!(vassoiTuttiPieni_1,nrVassoio )
            end
            if filaVassoio == "F02"
                push!(vassoiTuttiPieni_2,nrVassoio )
            end
            if filaVassoio == "F03"
                push!(vassoiTuttiPieni_3,nrVassoio )
            end
            if filaVassoio == "F04"
                push!(vassoiTuttiPieni_4,nrVassoio )
            end           
        end    
          
    end
end
tab = "\t\t"
println(" ")
println("NumerositĂ  totali e per fila   : ", "totali", tab ,"fila1",tab , "fila2",tab ,"fila3",tab ,"fila4")
println("NumerositĂ  vassoi con qualcosa : ", length(vassoiConQualcosa), tab ,length(vassoiConQualcosa_1),tab , length(vassoiConQualcosa_2),tab ,length(vassoiConQualcosa_3),tab ,length(vassoiConQualcosa_4))
println("NumerositĂ  vassoi tutti pieni  : ", length(vassoiTuttiPieni), tab ,length(vassoiTuttiPieni_1), tab ,length(vassoiTuttiPieni_2),tab ,length(vassoiTuttiPieni_3),tab ,length(vassoiTuttiPieni_4))
println("NumerositĂ  vassoi tutti vuoti  : ", length(vassoiTuttiVuoti), tab ,length(vassoiTuttiVuoti_1),tab , length(vassoiTuttiVuoti_2),tab , length(vassoiTuttiVuoti_3),tab ,length(vassoiTuttiVuoti_4) )
 
 

The php equivalent code, i have translated from my Julia code, is this one:

<?php

$folderInput ="c:/vmswap/robot/tabelle";
$folderOutput ="c:/vmswap/robot/";

function daFileAdArray($nomeTabella) {
    global $folderInput;
    $fn = $folderInput  . "/" . $nomeTabella;
    $t = file_get_contents($fn);
    $rows = explode("\r\n",$t);
    array_shift($rows);  
    return $rows;
} 

$ubicazioni = daFileAdArray("TAUTOMAGLOC.TXT");
$testaVassoi = daFileAdArray("TAUTOMAGVAS.TXT");
$internoVassoi = daFileAdArray("TAUTOMAGVASDETT.TXT");

# cross vassoi ubicazioni
echo "\nCalcolo dizionario id locazione / fila ...";

$dictIdLocazioneFila = [];

foreach($ubicazioni as $row) { 
    if($row>" ") {
       $s = explode(";",$row);   
       $idLocazione = $s[0];  
       $ubicazione = $s[7];
       $ubicaziones = explode(".",$ubicazione);
       $fila=$ubicaziones[2];
       $dictIdLocazioneFila[$idLocazione]=$fila; 
    }
}

echo "\nCalcolo dizionario nr vassoio / fila ...";
$dictVassoioFila = [];
foreach($testaVassoi as $row) { 
    if($row>" "){
       $s = explode(";",$row);   
       $nrVassoio = $s[0];  
       $idLocazione = $s[3];
       if (array_key_exists($idLocazione, $dictIdLocazioneFila)) {
          
         $fila = $dictIdLocazioneFila[ $idLocazione ];
         $dictVassoioFila[$nrVassoio]=$fila;
       }
    }
}

echo "\nCalcolo  ...";
# ---------------------------------
$indiceMasterSuSlave = 1;
$nrCellePerVassoio = [];  
foreach($internoVassoi as $row) {
    if($row>" "){          
        $s = explode(";",$row);
        $codiceArticolo = $s[3];
             
        $nrVassoio = $s[$indiceMasterSuSlave];   
        if (array_key_exists($nrVassoio, $dictVassoioFila)) {
           
            $fila = $dictVassoioFila[$nrVassoio]; 
           
            if (array_key_exists($nrVassoio, $nrCellePerVassoio)) {
                $x = $nrCellePerVassoio[ $nrVassoio ]; 
                $nrTotali = $x[0];
                $nrPiene = $x[1];
                $nrVuote = $x[2];
                
            } else {           
                 $nrTotali = 0;
                 $nrPiene = 0;
                 $nrVuote = 0;
            }    
            $nrTotali = $nrTotali + 1;
            
            if($codiceArticolo > "") {
                $nrPiene = $nrPiene + 1;
           
            } else {
                $nrVuote = $nrVuote + 1;        
            }
            
            $nrCellePerVassoio[ $nrVassoio ] = [$nrTotali,$nrPiene,$nrVuote];   
        }    
    }
}

# ---------------------------------
echo "\nCalcolo finale  ...";
$vassoi = [];

foreach($testaVassoi as $row) {
    $s = explode(";",$row);
    $nrVassoio = $s[0];
    if (array_key_exists($nrVassoio, $nrCellePerVassoio)) {
    
            $vassoi[]= $nrVassoio;      
    }
}
echo "\nnr totale vassoi ubicati = ".count($vassoi);

echo "n========================================";

# ---------------------------------
 
$vassoiConQualcosa = [];
$vassoiTuttiPieni =[];
$vassoiTuttiVuoti = [];

$vassoiConQualcosa_1 = [];
$vassoiTuttiPieni_1 = [];
$vassoiTuttiVuoti_1 = [];

$vassoiConQualcosa_2 = [];
$vassoiTuttiPieni_2 = [];
$vassoiTuttiVuoti_2 = [];

$vassoiConQualcosa_3 = [];
$vassoiTuttiPieni_3 = [];
$vassoiTuttiVuoti_3 = [];

$assoiConQualcosa_4 = [];
$vassoiTuttiPieni_4 = [];
$vassoiTuttiVuoti_4 = [];

foreach($testaVassoi as $row){
    $s = explode(";",$row);
    $nrVassoio = $s[0];
    if (array_key_exists($nrVassoio, $nrCellePerVassoio)) {
    
        $valoriPerVassoio =  $nrCellePerVassoio[ $nrVassoio ]; 
        $filaVassoio = $dictVassoioFila[$nrVassoio];
        if( 
                 ($valoriPerVassoio[1] > 0) && 
                 (!($valoriPerVassoio[0] == $valoriPerVassoio[1]) )
           ) {

            $vassoiConQualcosa[] =  $nrVassoio ;
 
            if($filaVassoio == "F01") {
                $vassoiConQualcosa_1[] = $nrVassoio;
            }
            if($filaVassoio == "F02") {
                $vassoiConQualcosa_2[] = $nrVassoio;
            }
            if($filaVassoio == "F03") {
                $vassoiConQualcosa_3[] = $nrVassoio;
            }
            if($filaVassoio == "F04") {
                $vassoiConQualcosa_4[] = $nrVassoio;
            }
             

        }
        if($valoriPerVassoio[1] == 0){
            #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
            #print( nrVassoio, ", "  )
            $vassoiTuttiVuoti[] = $nrVassoio;
         
            if($filaVassoio == "F01") {
                $vassoiTuttiVuoti_1[] = $nrVassoio;
            }
            if($filaVassoio == "F02") {
                $vassoiTuttiVuoti_2[] = $nrVassoio;
            }
            if($filaVassoio == "F03") {
                $vassoiTuttiVuoti_3[] = $nrVassoio;
            }
            if($filaVassoio == "F04") {
                $vassoiTuttiVuoti_4[] = $nrVassoio;
            }                    
                    
        }
        
        if($valoriPerVassoio[1] == $valoriPerVassoio[0]) {
            #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
            #print( nrVassoio, ", "  )
            $vassoiTuttiPieni[] = $nrVassoio;
         
                    
            if($filaVassoio == "F01") {
                $vassoiTuttiPieni_1[] = $nrVassoio;
            }
            if($filaVassoio == "F02") {
                $vassoiTuttiPieni_2[] = $nrVassoio;
            }
            if($filaVassoio == "F03") {
                $vassoiTuttiPieni_3[] = $nrVassoio;
            }
            if($filaVassoio == "F04") {
                $vassoiTuttiPieni_4[] = $nrVassoio;
            }    
        } 
    }
}

$tab = "\t\t";
echo " ";
echo "\nNumerositĂ  totali e per fila   : ". "totali". $tab ."fila1".$tab . "fila2".$tab ."fila3".$tab ."fila4";
echo "\nNumerositĂ  vassoi con qualcosa : ". count($vassoiConQualcosa). $tab .count($vassoiConQualcosa_1).$tab . count($vassoiConQualcosa_2).$tab .count($vassoiConQualcosa_3).$tab .count($vassoiConQualcosa_4);
echo "\nNumerositĂ  vassoi tutti pieni  : ". count($vassoiTuttiPieni). $tab . count($vassoiTuttiPieni_1). $tab .count($vassoiTuttiPieni_2).$tab .count($vassoiTuttiPieni_3).$tab .count($vassoiTuttiPieni_4);
echo "\nNumerositĂ  vassoi tutti vuoti  : ". count($vassoiTuttiVuoti). $tab .count($vassoiTuttiVuoti_1).$tab . count($vassoiTuttiVuoti_2).$tab . count($vassoiTuttiVuoti_3).$tab .count($vassoiTuttiVuoti_4) ;

?>

Ok, thanks again for advices.
Darione

1 Like

You operate mostly in global scope with global variables. Check out the performance tips section of the manual for some pointers and explanations of why this leads to slow code. Try putting all code in functions and make sure that variables that are accessed on performance sensitive parts of your code are either local or constant.

5 Likes

I have modified in this way, using functions has you suggested:

folderInput ="c:/vmswap/robot/tabelle"
folderOutput ="c:/vmswap/robot/"

function daFileAdArray(nomeTabella)
    fn = folderInput  * "/" * nomeTabella
    st = open(fn) do file
        read(file, String)
    end
    rows = split(st, "\r\n") 
    deleteat!(rows,1); #cancello prima riga nome campi
    return rows
end

function daiLocazioneFila(ubicazioni)
    println("Calcolo dizionario id locazione / fila ...")
    dictIdLocazioneFila= Dict()
    for row in ubicazioni
        if row>" "
        s = split(row,";")   
            idLocazione = s[1]  
            ubicazione = s[8]
            ubicaziones = split(ubicazione,".")
            fila=ubicaziones[3]
            dictIdLocazioneFila[idLocazione]=fila 
        end
    end
    return  dictIdLocazioneFila
end

function daiVassoioFila(testaVassoi, dictIdLocazioneFila)

    println("Calcolo dizionario nr vassoio / fila ...")
    dictVassoioFila = Dict()
    for row in testaVassoi
        if row>" "
           s = split(row,";")   
           nrVassoio = s[1]  
           idLocazione = s[4]
           if haskey(dictIdLocazioneFila, idLocazione)     
             fila = dictIdLocazioneFila[ idLocazione ]
             dictVassoioFila[nrVassoio]=fila
           end
        end
    end
    return dictVassoioFila
end

function cross(internoVassoi, dictVassoioFila)

    println("Calcolo cross  ...")
    # ---------------------------------    
    nrCellePerVassoio = Dict();  
    for row in internoVassoi
        if row>" "          
            s = split(row,";")
            codiceArticolo = s[4]                 
            nrVassoio = s[2]   
            
            if haskey(dictVassoioFila, nrVassoio)     
                fila = dictVassoioFila[nrVassoio]  
                nrTotali, nrPiene, nrVuote = [0,0,0]

                if haskey(nrCellePerVassoio, nrVassoio)
                    nrTotali, nrPiene, nrVuote = nrCellePerVassoio[ nrVassoio ] 
                else
                    nrCellePerVassoio[ nrVassoio ] = [nrTotali,nrPiene,nrVuote]  
                end 
            
                nrTotali += 1
                if codiceArticolo > ""                    
                    nrPiene += 1 
                else                 
                    nrVuote += 1        
                end   
                nrCellePerVassoio[ nrVassoio ][1] = nrTotali
                nrCellePerVassoio[ nrVassoio ][2] = nrPiene
                nrCellePerVassoio[ nrVassoio ][3] = nrVuote           
                
            end    
        end
    end
    return nrCellePerVassoio
end


function calcolaVassoi(testaVassoi, nrCellePerVassoio)
    # ---------------------------------
    println("Calcolo finale  ...") 
    vassoi= copy([])

    for row in testaVassoi
        s = split(row,";")
        nrVassoio = s[1]
        if haskey(nrCellePerVassoio, nrVassoio)
        
                #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                #print( nrVassoio, ", "  )
                push!(vassoi,nrVassoio )
        
        end
    end
    println("nr totale vassoi ubicati = " , length(vassoi))
    println("========================================") 
    return vassoi
end


function calcoloFinale(testaVassoi, nrCellePerVassoio,dictVassoioFila)
    vassoiConQualcosa = copy([])
    vassoiTuttiPieni = copy([])
    vassoiTuttiVuoti = copy([])

    vassoiConQualcosa_1 = copy([])
    vassoiTuttiPieni_1 = copy([])
    vassoiTuttiVuoti_1 = copy([])

    vassoiConQualcosa_2 = copy([])
    vassoiTuttiPieni_2 = copy([])
    vassoiTuttiVuoti_2 = copy([])

    vassoiConQualcosa_3 = copy([])
    vassoiTuttiPieni_3 = copy([])
    vassoiTuttiVuoti_3 = copy([])

    vassoiConQualcosa_4 = copy([])
    vassoiTuttiPieni_4 = copy([])
    vassoiTuttiVuoti_4 = copy([])

    for row in testaVassoi
        s = split(row,";")
        nrVassoio = s[1]
        if haskey(nrCellePerVassoio, nrVassoio)
            valoriPerVassoio =  nrCellePerVassoio[ nrVassoio ] 
            filaVassoio = dictVassoioFila[nrVassoio]
            if (valoriPerVassoio[2] > 0) && (!(valoriPerVassoio[1] == valoriPerVassoio[2]) )
                #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                #print( nrVassoio, ", "  )
                push!(vassoiConQualcosa,nrVassoio )

                if filaVassoio == "F01"
                    push!(vassoiConQualcosa_1,nrVassoio )
                end
                if filaVassoio == "F02"
                    push!(vassoiConQualcosa_2,nrVassoio )
                end
                if filaVassoio == "F03"
                    push!(vassoiConQualcosa_3,nrVassoio )
                end
                if filaVassoio == "F04"
                    push!(vassoiConQualcosa_4,nrVassoio )
                end


            end
            if valoriPerVassoio[2] == 0
                #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                #print( nrVassoio, ", "  )
                push!(vassoiTuttiVuoti,nrVassoio )
                if filaVassoio == "F01"
                    push!(vassoiTuttiVuoti_1,nrVassoio )
                end
                if filaVassoio == "F02"
                    push!(vassoiTuttiVuoti_2,nrVassoio )
                end
                if filaVassoio == "F03"
                    push!(vassoiTuttiVuoti_3,nrVassoio )
                end
                if filaVassoio == "F04"
                    push!(vassoiTuttiVuoti_4,nrVassoio )
                end            
            end          
            if valoriPerVassoio[2] == valoriPerVassoio[1]
                #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                #print( nrVassoio, ", "  )
                push!(vassoiTuttiPieni,nrVassoio )
                if filaVassoio == "F01"
                    push!(vassoiTuttiPieni_1,nrVassoio )
                end
                if filaVassoio == "F02"
                    push!(vassoiTuttiPieni_2,nrVassoio )
                end
                if filaVassoio == "F03"
                    push!(vassoiTuttiPieni_3,nrVassoio )
                end
                if filaVassoio == "F04"
                    push!(vassoiTuttiPieni_4,nrVassoio )
                end           
            end    
            
        end
    end
    tab = "\t\t"
    println(" ")
    println("NumerositĂ  totali e per fila   : ", "totali", tab ,"fila1",tab , "fila2",tab ,"fila3",tab ,"fila4")
    println("NumerositĂ  vassoi con qualcosa : ", length(vassoiConQualcosa), tab ,length(vassoiConQualcosa_1),tab , length(vassoiConQualcosa_2),tab ,length(vassoiConQualcosa_3),tab ,length(vassoiConQualcosa_4))
    println("NumerositĂ  vassoi tutti pieni  : ", length(vassoiTuttiPieni), tab ,length(vassoiTuttiPieni_1), tab ,length(vassoiTuttiPieni_2),tab ,length(vassoiTuttiPieni_3),tab ,length(vassoiTuttiPieni_4))
    println("NumerositĂ  vassoi tutti vuoti  : ", length(vassoiTuttiVuoti), tab ,length(vassoiTuttiVuoti_1),tab , length(vassoiTuttiVuoti_2),tab , length(vassoiTuttiVuoti_3),tab ,length(vassoiTuttiVuoti_4) )
end

function statistica()
    @time xubicazioni = daFileAdArray("TAUTOMAGLOC.TXT")
    @time xtestaVassoi = daFileAdArray("TAUTOMAGVAS.TXT")
    @time xinternoVassoi = daFileAdArray("TAUTOMAGVASDETT.TXT")
    @time xdictIdLocazioneFila = daiLocazioneFila(xubicazioni)
    @time xdictVassoioFila = daiVassoioFila(xtestaVassoi,xdictIdLocazioneFila) 
    @time xnrCellePerVassoio = cross(xinternoVassoi, xdictVassoioFila)
    @time vassoi = calcolaVassoi(xtestaVassoi, xnrCellePerVassoio)
    @time calcoloFinale(xtestaVassoi, xnrCellePerVassoio,xdictVassoioFila)
end

statistica()

Using @time macro, i see that the most of the time is wasted in function cross


function cross(internoVassoi, dictVassoioFila)

    println("Calcolo cross  ...")
    # ---------------------------------    
    nrCellePerVassoio = Dict();  
    for row in internoVassoi
        if row>" "          
            s = split(row,";")
            codiceArticolo = s[4]                 
            nrVassoio = s[2]   
            
            if haskey(dictVassoioFila, nrVassoio)     
                fila = dictVassoioFila[nrVassoio]  
                nrTotali, nrPiene, nrVuote = [0,0,0]

                if haskey(nrCellePerVassoio, nrVassoio)
                    nrTotali, nrPiene, nrVuote = nrCellePerVassoio[ nrVassoio ] 
                else
                    nrCellePerVassoio[ nrVassoio ] = [nrTotali,nrPiene,nrVuote]  
                end 
            
                nrTotali += 1
                if codiceArticolo > ""                    
                    nrPiene += 1 
                else                 
                    nrVuote += 1        
                end   
                nrCellePerVassoio[ nrVassoio ][1] = nrTotali
                nrCellePerVassoio[ nrVassoio ][2] = nrPiene
                nrCellePerVassoio[ nrVassoio ][3] = nrVuote           
                
            end    
        end
    end
    return nrCellePerVassoio
end

Probably the issue is… in the way i declase/use the Dictionary?
Darione

Yeah, the dict is not typed. If you declare the types of keys and values when you create the dict, you can possibly improve performance.

2 Likes

As mentioned, use a typed Dict. And It seems you can remove some of the Dict lookups. Does this work:


function cross(internoVassoi, dictVassoioFila)

    println("Calcolo cross  ...")
    # ---------------------------------    
    nrCellePerVassoio = Dict{String,Vector{Int64}}();
    for row in internoVassoi
        if row>" "          
            s = split(row,";")
            codiceArticolo = s[4]                 
            nrVassoio = s[2]   
            
            if haskey(dictVassoioFila, nrVassoio)     
                fila = dictVassoioFila[nrVassoio]  

                nrTotali, nrPiene, nrVuote = get(nrCellePerVassoio, nrVassoio, [0,0,0])
            
                nrTotali += 1
                if codiceArticolo > ""                    
                    nrPiene += 1 
                else                 
                    nrVuote += 1        
                end   
                nrCellePerVassoio[ nrVassoio ] = [nrTotali,nrPiene,nrVuote]          
                
            end    
        end
    end
    return nrCellePerVassoio
end

I can’t do better then the PHP code :-/

I also try in this way, splitting the “cross” function , but performances are the same :-/


function crossdo(row, nrCellePerVassoio, dictVassoioFila)
    if row>" " 
        s = split(row,";")
        codiceArticolo = s[4]                 
        nrVassoio = s[2]
        if haskey(dictVassoioFila, nrVassoio)     
            fila = dictVassoioFila[nrVassoio]  
            nrTotali, nrPiene, nrVuote = [0,0,0]

            if haskey(nrCellePerVassoio, nrVassoio)
                nrTotali, nrPiene, nrVuote = nrCellePerVassoio[ nrVassoio ] 
            else
                nrCellePerVassoio[ nrVassoio ] = [nrTotali,nrPiene,nrVuote]  
            end 
        
            nrTotali += 1
            if codiceArticolo > ""                    
                nrPiene += 1 
            else                 
                nrVuote += 1        
            end   
            nrCellePerVassoio[ nrVassoio ][1] = nrTotali
            nrCellePerVassoio[ nrVassoio ][2] = nrPiene
            nrCellePerVassoio[ nrVassoio ][3] = nrVuote           
            
        end  
    end
end

function cross(internoVassoi, dictVassoioFila)

    println("Calcolo cross  ...")
    # ---------------------------------    
    xnrCellePerVassoio = Dict{String,Array{Int64}}();  
    for xrow in internoVassoi        
            crossdo(xrow, xnrCellePerVassoio, dictVassoioFila)       
    end
    return xnrCellePerVassoio
end

Dict{String,Array{Int64}}()

is not a concrete type. Use Vector{Int64}() or Array{Int64,1}() for 1D arrays. There are many ways to get more speed, but getting type stability (see also @code_warntype) is one of the first things I would fix.

2 Likes

I tried to replace the type as you suggested, but the processing time didn’t improve.:-/

did you try the code I posted above? If yes, I recommend profiling to see where the bottleneck is.

Are you comparing the julia and the php code in script mode?
Starting julia and compiling the code can take quite a bit of time.
If you really need the script mode, maybe this helps: ANN: DaemonMode.jl, a package to run faster scripts in Julia

1 Like

I would like to test it, but i doesn’t install …
What is wrong?


julia> import Pkg

julia> Pkg.add("DaemonMode")
   Updating registry at `C:\Users\Renzo\.julia\registries\General`
   Updating git-repo `https://github.com/JuliaRegistries/General.git`
ERROR: The following package names could not be resolved:
 * DaemonMode (not found in project, manifest or registry)

Stacktrace:
 [1] pkgerror(::String) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Pkg\src\Types.jl:53
 [2] ensure_resolved(::Pkg.Types.Context, ::Array{Pkg.Types.PackageSpec,1}; registry::Bool) at D:\buildbot\worker\packag
e_win64\build\usr\share\julia\stdlib\v1.4\Pkg\src\Types.jl:802
 [3] add(::Pkg.Types.Context, ::Array{Pkg.Types.PackageSpec,1}; preserve::Pkg.Types.PreserveLevel, platform::Pkg.BinaryP
latforms.Windows, kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at D:\buildbot\worker\pa
ckage_win64\build\usr\share\julia\stdlib\v1.4\Pkg\src\API.jl:148
 [4] add(::Pkg.Types.Context, ::Array{Pkg.Types.PackageSpec,1}) at D:\buildbot\worker\package_win64\build\usr\share\juli
a\stdlib\v1.4\Pkg\src\API.jl:112
 [5] #add#27 at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Pkg\src\API.jl:109 [inlined]
 [6] add at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Pkg\src\API.jl:109 [inlined]
 [7] #add#24 at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Pkg\src\API.jl:107 [inlined]
 [8] add at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Pkg\src\API.jl:107 [inlined]
 [9] add(::String; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at D:\buildbot\worker\p
ackage_win64\build\usr\share\julia\stdlib\v1.4\Pkg\src\API.jl:106
 [10] add(::String) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Pkg\src\API.jl:106
 [11] top-level scope at REPL[2]:1

julia>

it seems it is not registered.
Try this

using Pkg
dm = PackageSpec(url="https://github.com/dmolina/DaemonMode.jl")
Pkg.add(dm)

So we are talking about 0.9s vs. 0.7s when running as script, which involves compilation time. I am not sure if you can get much faster than that, other than using DaemonMode or putting the compiled packages into your Julia distribution using PackageCompiler.

I have rather another question: is this really a problem? Are you running this scripts thousands/millions of times? If so, consider running it once and do the loop over multiple files inside the Julia process. I am absolutely sure that the actual code in Julia is much faster than the PHP one, but negligible to the compilation time overhead.

4 Likes

exactly. when you call the script Julia compiles your code and then executes it. if the time is 0.9 seconds probably 0.895 is compilation and 0.005 is execution.

1 Like

I try calling the same elaboration 100 times, so to be sure that the compiled time has been spent for the first call, but not for the 99 next calls … here the Julia code:

folderInput ="c:/vmswap/robot/tabelle"
folderOutput ="c:/vmswap/robot/"

function daFileAdArray(nomeTabella)
    fn = folderInput  * "/" * nomeTabella
    st = open(fn) do file
        read(file, String)
    end
    rows = split(st, "\r\n") 
    deleteat!(rows,1); #cancello prima riga nome campi
    return rows
end

function daiLocazioneFila(ubicazioni)
    println("Calcolo dizionario id locazione / fila ...")
    dictIdLocazioneFila= Dict{String, String}()
    for row in ubicazioni
        if row>" "
        s = split(row,";")   
            idLocazione = s[1]  
            ubicazione = s[8]
            ubicaziones = split(ubicazione,".")
            fila=ubicaziones[3]
            dictIdLocazioneFila[idLocazione]=fila 
        end
    end
    return  dictIdLocazioneFila
end

function daiVassoioFila(testaVassoi, dictIdLocazioneFila)

    println("Calcolo dizionario nr vassoio / fila ...")
    dictVassoioFila = Dict{String,String}();  
    for row in testaVassoi
        if row>" "
           s = split(row,";")   
           nrVassoio = s[1]  
           idLocazione = s[4]
           if haskey(dictIdLocazioneFila, idLocazione)     
             fila = dictIdLocazioneFila[ idLocazione ]
             dictVassoioFila[nrVassoio]=fila
           end
        end
    end
    return dictVassoioFila
end
 
function crossdo(row, nrCellePerVassoio, dictVassoioFila)
    if row>" " 
        s = split(row,";")
        codiceArticolo = s[4]                 
        nrVassoio = s[2]
        if haskey(dictVassoioFila, nrVassoio)     
            fila = dictVassoioFila[nrVassoio]  
            nrTotali, nrPiene, nrVuote = [0,0,0]

            if haskey(nrCellePerVassoio, nrVassoio)
                nrTotali, nrPiene, nrVuote = nrCellePerVassoio[ nrVassoio ] 
            else
                nrCellePerVassoio[ nrVassoio ] = [nrTotali,nrPiene,nrVuote]  
            end 
        
            nrTotali += 1
            if codiceArticolo > ""                    
                nrPiene += 1 
            else                 
                nrVuote += 1        
            end   
            nrCellePerVassoio[ nrVassoio ][1] = nrTotali
            nrCellePerVassoio[ nrVassoio ][2] = nrPiene
            nrCellePerVassoio[ nrVassoio ][3] = nrVuote           
            
        end  
    end
end

function cross(internoVassoi, dictVassoioFila)

    println("Calcolo cross  ...")
    # ---------------------------------    
    xnrCellePerVassoio = Dict{String,Array{Int64}}();  
    for xrow in internoVassoi        
            crossdo(xrow, xnrCellePerVassoio, dictVassoioFila)       
    end
    return xnrCellePerVassoio
end

function calcolaVassoi(testaVassoi, nrCellePerVassoio)
    # ---------------------------------
    println("Calcolo finale  ...") 
    vassoi= copy([])

    for row in testaVassoi
        s = split(row,";")
        nrVassoio = s[1]
        if haskey(nrCellePerVassoio, nrVassoio)
        
                #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                #print( nrVassoio, ", "  )
                push!(vassoi,nrVassoio )
        
        end
    end
    println("nr totale vassoi ubicati = " , length(vassoi))
    println("========================================") 
    return vassoi
end


function calcoloFinale(testaVassoi, nrCellePerVassoio,dictVassoioFila)
    vassoiConQualcosa = copy([])
    vassoiTuttiPieni = copy([])
    vassoiTuttiVuoti = copy([])

    vassoiConQualcosa_1 = copy([])
    vassoiTuttiPieni_1 = copy([])
    vassoiTuttiVuoti_1 = copy([])

    vassoiConQualcosa_2 = copy([])
    vassoiTuttiPieni_2 = copy([])
    vassoiTuttiVuoti_2 = copy([])

    vassoiConQualcosa_3 = copy([])
    vassoiTuttiPieni_3 = copy([])
    vassoiTuttiVuoti_3 = copy([])

    vassoiConQualcosa_4 = copy([])
    vassoiTuttiPieni_4 = copy([])
    vassoiTuttiVuoti_4 = copy([])

    for row in testaVassoi
        s = split(row,";")
        nrVassoio = s[1]
        if haskey(nrCellePerVassoio, nrVassoio)
            valoriPerVassoio =  nrCellePerVassoio[ nrVassoio ] 
            filaVassoio = dictVassoioFila[nrVassoio]
            if (valoriPerVassoio[2] > 0) && (!(valoriPerVassoio[1] == valoriPerVassoio[2]) )
                #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                #print( nrVassoio, ", "  )
                push!(vassoiConQualcosa,nrVassoio )

                if filaVassoio == "F01"
                    push!(vassoiConQualcosa_1,nrVassoio )
                end
                if filaVassoio == "F02"
                    push!(vassoiConQualcosa_2,nrVassoio )
                end
                if filaVassoio == "F03"
                    push!(vassoiConQualcosa_3,nrVassoio )
                end
                if filaVassoio == "F04"
                    push!(vassoiConQualcosa_4,nrVassoio )
                end


            end
            if valoriPerVassoio[2] == 0
                #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                #print( nrVassoio, ", "  )
                push!(vassoiTuttiVuoti,nrVassoio )
                if filaVassoio == "F01"
                    push!(vassoiTuttiVuoti_1,nrVassoio )
                end
                if filaVassoio == "F02"
                    push!(vassoiTuttiVuoti_2,nrVassoio )
                end
                if filaVassoio == "F03"
                    push!(vassoiTuttiVuoti_3,nrVassoio )
                end
                if filaVassoio == "F04"
                    push!(vassoiTuttiVuoti_4,nrVassoio )
                end            
            end          
            if valoriPerVassoio[2] == valoriPerVassoio[1]
                #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                #print( nrVassoio, ", "  )
                push!(vassoiTuttiPieni,nrVassoio )
                if filaVassoio == "F01"
                    push!(vassoiTuttiPieni_1,nrVassoio )
                end
                if filaVassoio == "F02"
                    push!(vassoiTuttiPieni_2,nrVassoio )
                end
                if filaVassoio == "F03"
                    push!(vassoiTuttiPieni_3,nrVassoio )
                end
                if filaVassoio == "F04"
                    push!(vassoiTuttiPieni_4,nrVassoio )
                end           
            end    
            
        end
    end
    tab = "\t\t"
    println(" ")
    println("NumerositĂ  totali e per fila   : ", "totali", tab ,"fila1",tab , "fila2",tab ,"fila3",tab ,"fila4")
    println("NumerositĂ  vassoi con qualcosa : ", length(vassoiConQualcosa), tab ,length(vassoiConQualcosa_1),tab , length(vassoiConQualcosa_2),tab ,length(vassoiConQualcosa_3),tab ,length(vassoiConQualcosa_4))
    println("NumerositĂ  vassoi tutti pieni  : ", length(vassoiTuttiPieni), tab ,length(vassoiTuttiPieni_1), tab ,length(vassoiTuttiPieni_2),tab ,length(vassoiTuttiPieni_3),tab ,length(vassoiTuttiPieni_4))
    println("NumerositĂ  vassoi tutti vuoti  : ", length(vassoiTuttiVuoti), tab ,length(vassoiTuttiVuoti_1),tab , length(vassoiTuttiVuoti_2),tab , length(vassoiTuttiVuoti_3),tab ,length(vassoiTuttiVuoti_4) )
end

function statistica()
     xubicazioni = daFileAdArray("TAUTOMAGLOC.TXT")
     xtestaVassoi = daFileAdArray("TAUTOMAGVAS.TXT")
     xinternoVassoi = daFileAdArray("TAUTOMAGVASDETT.TXT")
     xdictIdLocazioneFila = daiLocazioneFila(xubicazioni)
     xdictVassoioFila = daiVassoioFila(xtestaVassoi,xdictIdLocazioneFila) 
     xnrCellePerVassoio = cross(xinternoVassoi, xdictVassoioFila)
    vassoi = calcolaVassoi(xtestaVassoi, xnrCellePerVassoio)
      calcoloFinale(xtestaVassoi, xnrCellePerVassoio,xdictVassoioFila)
end

 
for i in 1:100
    statistica()
    println("was the ",i,"° computation.")
end
 

here the php code, again a loop of 100 times:

<?php

$folderInput ="c:/vmswap/robot/tabelle";
$folderOutput ="c:/vmswap/robot/";

function daFileAdArray($nomeTabella) {
    global $folderInput;
    $fn = $folderInput  . "/" . $nomeTabella;
    $t = file_get_contents($fn);
    $rows = explode("\r\n",$t);
    array_shift($rows);  
    return $rows;
} 

for($k=1; $k<=100; $k++){
        $ubicazioni = daFileAdArray("TAUTOMAGLOC.TXT");
        $testaVassoi = daFileAdArray("TAUTOMAGVAS.TXT");
        $internoVassoi = daFileAdArray("TAUTOMAGVASDETT.TXT");

        # cross vassoi ubicazioni
        echo "\nCalcolo dizionario id locazione / fila ...";

        $dictIdLocazioneFila = [];

        foreach($ubicazioni as $row) { 
            if($row>" ") {
               $s = explode(";",$row);   
               $idLocazione = $s[0];  
               $ubicazione = $s[7];
               $ubicaziones = explode(".",$ubicazione);
               $fila=$ubicaziones[2];
               $dictIdLocazioneFila[$idLocazione]=$fila; 
            }
        }

        echo "\nCalcolo dizionario nr vassoio / fila ...";
        $dictVassoioFila = [];
        foreach($testaVassoi as $row) { 
            if($row>" "){
               $s = explode(";",$row);   
               $nrVassoio = $s[0];  
               $idLocazione = $s[3];
               if (array_key_exists($idLocazione, $dictIdLocazioneFila)) {

                 $fila = $dictIdLocazioneFila[ $idLocazione ];
                 $dictVassoioFila[$nrVassoio]=$fila;
               }
            }
        }

        echo "\nCalcolo  ...";
        # ---------------------------------
        $indiceMasterSuSlave = 1;
        $nrCellePerVassoio = [];  
        foreach($internoVassoi as $row) {
            if($row>" "){          
                $s = explode(";",$row);
                $codiceArticolo = $s[3];

                $nrVassoio = $s[$indiceMasterSuSlave];   
                if (array_key_exists($nrVassoio, $dictVassoioFila)) {

                    $fila = $dictVassoioFila[$nrVassoio]; 

                    if (array_key_exists($nrVassoio, $nrCellePerVassoio)) {
                        $x = $nrCellePerVassoio[ $nrVassoio ]; 
                        $nrTotali = $x[0];
                        $nrPiene = $x[1];
                        $nrVuote = $x[2];

                    } else {           
                         $nrTotali = 0;
                         $nrPiene = 0;
                         $nrVuote = 0;
                    }    
                    $nrTotali = $nrTotali + 1;

                    if($codiceArticolo > "") {
                        $nrPiene = $nrPiene + 1;

                    } else {
                        $nrVuote = $nrVuote + 1;        
                    }

                    $nrCellePerVassoio[ $nrVassoio ] = [$nrTotali,$nrPiene,$nrVuote];   
                }    
            }
        }

        # ---------------------------------
        echo "\nCalcolo finale  ...";
        $vassoi = [];

        foreach($testaVassoi as $row) {
            $s = explode(";",$row);
            $nrVassoio = $s[0];
            if (array_key_exists($nrVassoio, $nrCellePerVassoio)) {

                    $vassoi[]= $nrVassoio;      
            }
        }
        echo "\nnr totale vassoi ubicati = ".count($vassoi);

        echo "n========================================";

        # ---------------------------------

        $vassoiConQualcosa = [];
        $vassoiTuttiPieni =[];
        $vassoiTuttiVuoti = [];

        $vassoiConQualcosa_1 = [];
        $vassoiTuttiPieni_1 = [];
        $vassoiTuttiVuoti_1 = [];

        $vassoiConQualcosa_2 = [];
        $vassoiTuttiPieni_2 = [];
        $vassoiTuttiVuoti_2 = [];

        $vassoiConQualcosa_3 = [];
        $vassoiTuttiPieni_3 = [];
        $vassoiTuttiVuoti_3 = [];

        $assoiConQualcosa_4 = [];
        $vassoiTuttiPieni_4 = [];
        $vassoiTuttiVuoti_4 = [];

        foreach($testaVassoi as $row){
            $s = explode(";",$row);
            $nrVassoio = $s[0];
            if (array_key_exists($nrVassoio, $nrCellePerVassoio)) {

                $valoriPerVassoio =  $nrCellePerVassoio[ $nrVassoio ]; 
                $filaVassoio = $dictVassoioFila[$nrVassoio];
                if( 
                         ($valoriPerVassoio[1] > 0) && 
                         (!($valoriPerVassoio[0] == $valoriPerVassoio[1]) )
                   ) {

                    $vassoiConQualcosa[] =  $nrVassoio ;

                    if($filaVassoio == "F01") {
                        $vassoiConQualcosa_1[] = $nrVassoio;
                    }
                    if($filaVassoio == "F02") {
                        $vassoiConQualcosa_2[] = $nrVassoio;
                    }
                    if($filaVassoio == "F03") {
                        $vassoiConQualcosa_3[] = $nrVassoio;
                    }
                    if($filaVassoio == "F04") {
                        $vassoiConQualcosa_4[] = $nrVassoio;
                    }


                }
                if($valoriPerVassoio[1] == 0){
                    #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                    #print( nrVassoio, ", "  )
                    $vassoiTuttiVuoti[] = $nrVassoio;

                    if($filaVassoio == "F01") {
                        $vassoiTuttiVuoti_1[] = $nrVassoio;
                    }
                    if($filaVassoio == "F02") {
                        $vassoiTuttiVuoti_2[] = $nrVassoio;
                    }
                    if($filaVassoio == "F03") {
                        $vassoiTuttiVuoti_3[] = $nrVassoio;
                    }
                    if($filaVassoio == "F04") {
                        $vassoiTuttiVuoti_4[] = $nrVassoio;
                    }                    

                }

                if($valoriPerVassoio[1] == $valoriPerVassoio[0]) {
                    #println( nrVassoio, " = " , nrCellePerVassoio[nrVassoio] )
                    #print( nrVassoio, ", "  )
                    $vassoiTuttiPieni[] = $nrVassoio;


                    if($filaVassoio == "F01") {
                        $vassoiTuttiPieni_1[] = $nrVassoio;
                    }
                    if($filaVassoio == "F02") {
                        $vassoiTuttiPieni_2[] = $nrVassoio;
                    }
                    if($filaVassoio == "F03") {
                        $vassoiTuttiPieni_3[] = $nrVassoio;
                    }
                    if($filaVassoio == "F04") {
                        $vassoiTuttiPieni_4[] = $nrVassoio;
                    }    
                } 
            }
        }

        $tab = "\t\t";
        echo " ";
        echo "\nNumerositĂ  totali e per fila   : ". "totali". $tab ."fila1".$tab . "fila2".$tab ."fila3".$tab ."fila4";
        echo "\nNumerositĂ  vassoi con qualcosa : ". count($vassoiConQualcosa). $tab .count($vassoiConQualcosa_1).$tab . count($vassoiConQualcosa_2).$tab .count($vassoiConQualcosa_3).$tab .count($vassoiConQualcosa_4);
        echo "\nNumerositĂ  vassoi tutti pieni  : ". count($vassoiTuttiPieni). $tab . count($vassoiTuttiPieni_1). $tab .count($vassoiTuttiPieni_2).$tab .count($vassoiTuttiPieni_3).$tab .count($vassoiTuttiPieni_4);
        echo "\nNumerositĂ  vassoi tutti vuoti  : ". count($vassoiTuttiVuoti). $tab .count($vassoiTuttiVuoti_1).$tab . count($vassoiTuttiVuoti_2).$tab . count($vassoiTuttiVuoti_3).$tab .count($vassoiTuttiVuoti_4) ;

  echo "\nWas the $k ° computation.";        
}

?>

And here the Julia results:

NumerositĂ  vassoi tutti pieni  : 474            150             189             72              63
NumerositĂ  vassoi tutti vuoti  : 677            177             129             221             150
was the 98° computation.
Calcolo dizionario id locazione / fila ...
Calcolo dizionario nr vassoio / fila ...
Calcolo cross  ...
Calcolo finale  ...
nr totale vassoi ubicati = 1734
========================================

NumerositĂ  totali e per fila   : totali         fila1           fila2           fila3           fila4
NumerositĂ  vassoi con qualcosa : 583            128             164             113             178
NumerositĂ  vassoi tutti pieni  : 474            150             189             72              63
NumerositĂ  vassoi tutti vuoti  : 677            177             129             221             150
was the 99° computation.
Calcolo dizionario id locazione / fila ...
Calcolo dizionario nr vassoio / fila ...
Calcolo cross  ...
Calcolo finale  ...
nr totale vassoi ubicati = 1734
========================================

NumerositĂ  totali e per fila   : totali         fila1           fila2           fila3           fila4
NumerositĂ  vassoi con qualcosa : 583            128             164             113             178
NumerositĂ  vassoi tutti pieni  : 474            150             189             72              63
NumerositĂ  vassoi tutti vuoti  : 677            177             129             221             150
was the 100° computation.

Execution time: 18.165 s

c:\prg\julia>

Here the php results:

NumerositĂ  vassoi tutti pieni  : 474            150             189             72              63
NumerositĂ  vassoi tutti vuoti  : 677            177             129             221             150
Was the 98 ° computation.
Calcolo dizionario id locazione / fila ...
Calcolo dizionario nr vassoio / fila ...
Calcolo  ...
Calcolo finale  ...
nr totale vassoi ubicati = 1734n========================================
NumerositĂ  totali e per fila   : totali         fila1           fila2           fila3           fila4
NumerositĂ  vassoi con qualcosa : 583            128             164             113             17622
NumerositĂ  vassoi tutti pieni  : 474            150             189             72              63
NumerositĂ  vassoi tutti vuoti  : 677            177             129             221             150
Was the 99 ° computation.
Calcolo dizionario id locazione / fila ...
Calcolo dizionario nr vassoio / fila ...
Calcolo  ...
Calcolo finale  ...
nr totale vassoi ubicati = 1734n========================================
NumerositĂ  totali e per fila   : totali         fila1           fila2           fila3           fila4
NumerositĂ  vassoi con qualcosa : 583            128             164             113             17800
NumerositĂ  vassoi tutti pieni  : 474            150             189             72              63
NumerositĂ  vassoi tutti vuoti  : 677            177             129             221             150
Was the 100 ° computation.
Execution time: 20.094 s

c:\xampp\htdocs\robot>

There is a gain of only 2 seconds between the Julia and the PHP code.

:-/
I try also to run with 1000 iterations … running in the same moment the two script …jula ends consuming 218 seconds, PHP consuming 248 seconds. So , i see, the gain (from test with 100 iterations to the other with 1000) is about 10-12% … it seems to me to much little…

The much of time consumed is, using @time macro, here:

function crossdo(row, nrCellePerVassoio, dictVassoioFila)
    if row>" " 
        s = split(row,";")
        codiceArticolo = s[4]                 
        nrVassoio = s[2]
        if haskey(dictVassoioFila, nrVassoio)     
            fila = dictVassoioFila[nrVassoio]  
            nrTotali, nrPiene, nrVuote = [0,0,0]

            if haskey(nrCellePerVassoio, nrVassoio)
                nrTotali, nrPiene, nrVuote = nrCellePerVassoio[ nrVassoio ] 
            else
                nrCellePerVassoio[ nrVassoio ] = [nrTotali,nrPiene,nrVuote]  
            end 
        
            nrTotali += 1
            if codiceArticolo > ""                    
                nrPiene += 1 
            else                 
                nrVuote += 1        
            end   
            nrCellePerVassoio[ nrVassoio ][1] = nrTotali
            nrCellePerVassoio[ nrVassoio ][2] = nrPiene
            nrCellePerVassoio[ nrVassoio ][3] = nrVuote           
            
        end  
    end
end

function cross(internoVassoi, dictVassoioFila)

    println("Calcolo cross  ...")
    # ---------------------------------    
    xnrCellePerVassoio = Dict{String,Array{Int64}}();  
    for xrow in internoVassoi        
            crossdo(xrow, xnrCellePerVassoio, dictVassoioFila)       
    end
    return xnrCellePerVassoio
end

But i can’t imagine what is wrong … perhaps a wrong method of looking for the items in the Dict? i don’t understand …

Try using BenchmarkTools to @benchmark the statistica function rather than writing your own loop. I’m wondering if you are maybe allocating a lot of memory… the benchmark will tell you

1 Like

Benchmark modules gives these results:

...
Calcolo dizionario id locazione / fila ...
Calcolo dizionario nr vassoio / fila ...
Calcolo cross  ...
Calcolo finale  ...
nr totale vassoi ubicati = 1734
========================================

NumerositĂ  totali e per fila   : totali         fila1           fila2           fila3           fila4
NumerositĂ  vassoi con qualcosa : 583            128             164             113             178
NumerositĂ  vassoi tutti pieni  : 474            150             189             72              63
NumerositĂ  vassoi tutti vuoti  : 677            177             129             221             150
   143.401 ms (2787482 allocations: 105.75 MiB)

c:\prg\julia>

having done this instead of the loop:


#for i in 1:1000
#@benchmark begin
    @btime statistica()
#end
 #       println("was the ",i,"° computation.")
#end
 

So what does it means?

Here is the csv files … dimension are normals for me.

Not that I think this will have a big impact but why are you calling copy here?

Might also be useful to make Arrays with concrete types instead of Any (as will create).

It means the calculations are taking 143 milliseconds and allocating 105 Megabytes of RAM.

It seems you might benefit from reducing allocations, given that your file is only 1MB or less.

I suggest to call statistica once to ensure compilation, and then call @profile on it. you might need to return to using a loop to get good coverage

https://docs.julialang.org/en/v1/manual/profile/