Wyświetlanie list plików PHP vs Java

0

Witam.

PHP znam dość dobrze. Wiedząc że jest on wolniejszy od Javy, postanowiłem przerobić mój skrypt.
Pierwszym zadaniem jakie wykonałem to wyświetlenie listy plików i tu wynik wyszedł gorzej niż sądziłem, może robię coś źle, ale PHP w tym przypadku jest szybszy od Javy.

Kolejnym etapem będzie obróbka tych plików z formatu csv do jednego pliku xml.
Później eksport z pliku xml do bazy danych.

Czy końcowy rezultat będzie lepszy niż początek, czyli kod Javy będzie szybszy od PHP?
Ps. ten skrypt Javy piszę w celach edukacyjnych, jednak mimo tego oczekuję wzrostu szybkości...

Poniżej skrypty:

PHP:

 
<?php

class ListFiles {

    public function currentMillis() {
        list($usec, $sec) = explode(" ", microtime());
        return round(((float)$usec + (float)$sec) * 1000);
    }

    public function main()
    {
        $dirPath = 'z:/app/data/import/';

        $started = $this->currentMillis();
        $fileList = array();
        
        foreach (new \DirectoryIterator($dirPath) as $file) {
            $filePart = explode('.', $file->getFilename());
            $fileName = isset($filePart[0]) ? $filePart[0] : '';
            $fileExtension = isset($filePart[1]) ? $filePart[1] : '';
            if ($fileExtension == 'prn') {
                $filePath = $dirPath . $file->getFilename();  
                $fileList[] = $filePath;
            }
        }

        echo $this->currentMillis() - $started;
    }

}

$listFiles = new ListFiles();
$listFiles->main();

?>

Czas wykonywania kodu: ~14ms

Java:

 
import java.io.File;
 
public class ListFiles 
{
    public static void main(String[] args) 
    {
        // Directory path here
        String path = "z:/app/data/import/"; 

        String files;
        File folder = new File(path);
        File[] listOfFiles = folder.listFiles(); 
        
        long startTime = System.currentTimeMillis();

        for (int i = 0; i < listOfFiles.length; i++) 
        {
            if (listOfFiles[i].isFile()) 
            {
                files = listOfFiles[i].getName();
                if (files.endsWith(".prn"))
                {
                    // System.out.println(files);
                }
            }
        }
        
        long endTime   = System.currentTimeMillis();
        long totalTime = endTime - startTime;

        System.out.println(totalTime);
    }
}

Czas wykonywania kodu: ~9000ms

Powyższe kody testuję na 3400 plikach.

Podejrzewam, że PHP wykorzystuje funkcje systemowe, a Java własne wbudowane...
Proszę o pomoc w jaki sposób przyśpieszyć kod javy.

Z góry dziękuję.

0
  1. Odpal test kilka razy, lub czyść pamięć podręczną plików pomiędzy testami, by zmniejszyć wpływ kolejności testów na wyniki.
  2. Testy nic nie robią. Być może interpreter PHP w jakiś sposób orientuje się, że kod nic nie robi i go nie wykonuje. Spróbuj dodać chociażby jakieś zliczanie i wypisywanie licznika.
  3. Jest gotowa metoda File.listFiles(FileFilter), gdzie można podać filtr zamiast samemu ręcznie filtrować później.
  4. Java 7 zawiera metodę http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#newDirectoryStream(java.nio.file.Path,%20java.nio.file.DirectoryStream.Filter) która jest raczej lepszym wyborem, bo chociażby jest asynchroniczna.
  5. Do rekurencyjnego przechodzenia drzew folderów w Javie 7 jest gotowa metoda: Files.walkFileTree
  6. Sposób obsługi I/O przez interpreter/VMkę/etc będzie grał tu dużo większą rolę niż wydajność samej interpretacji czy zJITowanego kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1