Lazarus (FPC) vs Java

0

Hej! Pewnie takich porównań było już dużo, ale czy ktoś ma doświadczenie z Lazarusem w połączeniu z bazami danych? Czy to lepiej funkcjonuje niż Java + Appache Derby? Lazarus przypomina bardzo Delphi i C++ Buildera i widzę ciekawe komponenty bazodanowe, tylko pytanie jak to realnie działa?
P.S. Z ciekawości przerobiłem taki programik z Javy do Lazarusa i okazało się że np. program w Javie tą samą operacje wykonuje 6 sekund, a wersja napisana w Lazarusie 2,5 sekundy...

0

A kod napisany w c plus wykonuje się około 20 razy szybciej.. To sprawka przenosnosci kodu itd. pomimo tego wolałbym javę.. Lazarus to padaka.

0

Będę mieć chwilę czasu to przerobie kod na C++ (biblioteka wxWidgets) i na C# Podejrzewam, że C# będzie trochę szybszy od Javy, a C++ najszybszy

0

Kilka uwag:

  1. Na Ubuntu Java lata sporo szybciej niż Mono: Ubuntu 32-bit Core 2 Quad Ubuntu 64-bit Core 2 Quad
  2. H2 Database powinno być ok 2x szybsze niż Apache Derby: http://www.h2database.com/html/performance.html
  3. GUI w Javie możesz spróbować zaklepać w JavieFX 2.0 - jest wtyczka (do NetBeansa przynajmniej) dodająca wsparcie dla tej wersji JavyFX
  4. Musiałeś skopać implementację w Javie, wątpliwe by kod Pascalowy był szybszy od Javowego (tzn porównujemy kompilatory/ maszyny wirtualne)
0

Jakiej bazy danych użyłeś w przypadku Lazarusa i w przypadku Javy? Tej samej czy czegoś innego?
Baza danych to najczęściej wąskie gardło aplikacji, więc jeżeli użyłeś różnych baz danych to raczej to jest główna przyczyna w różnicach w wydajności.

0

Tzn. akurat ten program to nie jest typowo bazodanowy...
Kod zamieniający znaki w plikach :


procedure TForm1.Zamien_BitBtnClick(Sender: TObject);
var PlikWejsciowy, PlikWyjsciowy : TextFile;
var TekstZPliku, WczytanyTekst, TekstPoZmianach : string;
var czas1, czas2 : Int64;
begin
  czas1 := GetMsCount;
  Zamien_BitBtn.Enabled := false;
  Application.ProcessMessages;
  Screen.Cursor := crHourGlass;
  Application.ProcessMessages;
  TekstPoZmianach:='';
  TekstZPliku := '';
  if ((PlikWejsciowy_Edit.Text <> '') and (PlikWyjsciowy_Edit.Text <> ''))  then
  begin
          AssignFile(PlikWejsciowy, PlikWejsciowy_Edit.Text);
          Reset(PlikWejsciowy);
          while not (EOF(PlikWejsciowy)) do
          begin
               ReadLn(PlikWejsciowy, WczytanyTekst);
               TekstZPliku := TekstZPliku + WczytanyTekst + #13+#10;
          end;
          CloseFile(PlikWejsciowy);
          TekstPoZmianach := StringReplace(TekstZPliku, ZnakDoZnalezienia1_Edit.Text, ZnakDoZamiany1_Edit.Text, [rfReplaceAll]);
          TekstPoZmianach := StringReplace(TekstPoZmianach, ZnakDoZnalezienia2_Edit.Text, ZnakDoZamiany2_Edit.Text, [rfReplaceAll]);
  end;

  AssignFile(PlikWyjsciowy, PlikWyjsciowy_Edit.Text);
  Rewrite(PlikWyjsciowy);
  Write(PlikWyjsciowy, TekstPoZmianach);
  Flush(PlikWyjsciowy);
  CloseFile(PlikWyjsciowy);
  Zamien_BitBtn.Enabled := true;
  Application.ProcessMessages;
  Screen.Cursor := crDefault;
  Application.ProcessMessages;
  czas2 := GetMsCount;
  ShowMessage('Zamiany dokonano w czasie : ' + IntToStr(czas2-czas1) + ' ms'); 

Kod java :

/**
 * Funkcja zamieniająca podany łańcuch znaków na inny
 * @param builder łańcuch (ciąg) znaków, w którym będzie zamiana
 * @param from łańcuch (ciąg) znaków, który jest poszukiwany do zamiany
 * @param to łańcuch (ciąg) znaków, na który ma być zamieniony
 */
public static void replaceAll(StringBuilder builder, String from, String to)
{
    int index = builder.indexOf(from);
    while (index != -1)
    {
        builder.replace(index, index + from.length(), to);
        index += to.length(); // Move to the end of the replacement
        index = builder.indexOf(from, index);
    }

public class ZamianaTekstu_Watek extends Thread {
    public void run() {
        // Spradzamy czy wprowadzono ścieżkę i nazwę pliku
        // Jeśli nie to jest wyświetlany komunikat
        if ((PlikWejsciowy_jTextField.getText().equals("") == true) || (PlikWyjsciowy_jTextField.getText().equals("") == true))
        {
            JOptionPane.showMessageDialog(null, "Proszę wybrać plik wejściowy i wyjściowy! ", "Ostrzeżenie", JOptionPane.WARNING_MESSAGE);           
        } // jeśli wprowadzonn nazwy plików
        else
        {
        // ustaw klepsydrę jako kursor
        Cursor hourglassCursor = new Cursor(Cursor.WAIT_CURSOR);
        setCursor(hourglassCursor);
        // odśmiecamy pamieć tj. wymuszenie uruchomienia Garbage Collectora
          System.gc();
          long start,koniec,czas;
           start = java.lang.System.currentTimeMillis(); // bieżący czas w ms

        {
         try
             {
              // otwieramy plik - nazwa pliku jest już w kontrolce GUI TextField
             File file = new File(PlikWejsciowy_jTextField.getText());
             // przygytowanie do odczytu
             BufferedReader reader = new BufferedReader(new FileReader(file));
             String line = "";
             String oldtext = "";
             // w pętli odczytujemy linijka po linijce do końca pliku
             while((line = reader.readLine()) != null)
                 {
                 oldtext += line + "\r\n";
             }
             reader.close(); // zamykamy strumień
             // w celu szybszego działania zamianu używamk klasy StringBuilder
            StringBuilder sb_oldtext = new StringBuilder(oldtext); 
            // zamiana (funkcja do operacji na StringBuilder)
            replaceAll(sb_oldtext, ZnakiDoZnalezienia1_jTextField.getText(), ZnakiDoZamiany1_jTextField.getText()); 
            replaceAll(sb_oldtext,ZnakiDoZnalezienia2_jTextField.getText(), ZnakiDoZamiany2_jTextField.getText());  
            // zapis do pliku 
            FileWriter writer = new FileWriter(PlikWyjsciowy_jTextField.getText());
            writer.write(sb_oldtext.toString());
            // zapizs bufor
            writer.flush();
            // zamknięcie uchwytu pliku
            writer.close();

         }
         catch (IOException ioe)
             {
              JOptionPane.showMessageDialog(null, ioe.toString(), "Błąd", JOptionPane.ERROR_MESSAGE);

         }
     }
        // przywracamy kursor
        Cursor normalCursor = new Cursor(Cursor.DEFAULT_CURSOR);
        setCursor(normalCursor);
        koniec = java.lang.System.currentTimeMillis(); // bieżący czas w ms
        czas = koniec - start;//czas działań w ms
        double czas_w_sekundach = czas / 1000;
        double czas_w_minutach = czas_w_sekundach / 60;
             JOptionPane.showMessageDialog(null, "Dokonano zamiany w czasie  " + String.format("%.0f", czas_w_sekundach)                  
                + " sekund" + "( "+ Double.toString(czas_w_minutach) + " minut)" , "Komunikat", JOptionPane.INFORMATION_MESSAGE);
        // zamknięcie okna dialogowego z komunikatem o oczekiwaniu i animacją
        // wcześniej okno zostało pokazane przed wejściem w ten wątek
        OknoOczekiwaniaDialog.setVisible(false);
        }
1

Ten fragment jest wyjątkowo źle napisany

             String oldtext = "";
             // w pętli odczytujemy linijka po linijce do końca pliku
             while((line = reader.readLine()) != null)
                 {
                 oldtext += line + "\r\n";
             }

Zmienna oldtext winna być typu StringBuilder lub StringBuffer.

0
  1. Użyj String.replaceAll() zamiast tej swojej funkcji replaceAll()
  2. W pętli while dalej używasz konkatenacji Stringów zamiast StringBuildera.
  3. Po co w ogóle ładować wszystko naraz, skoro można odczytywać te linie pojedynczo, modyfikować i od razu zapisywać?
0

String.ReplaceAll działa w przypadku tylko stringa, nie działa w przypadku StringBuffer lub StringBuilder... Tzn, nie ma takiego samego zaczenia co String.ReplaceAll... Stąd ten własny kod.
Hmm jak chce zmienic na :

             StringBuilder line = "";
             StringBuilder oldtext = "";
             // w pętli odczytujemy linijka po linijce do końca pliku
             while((line = reader.readLine()) != null)
                 {
                 oldtext += line + "\r\n";
             }

to kompilator rzuca błedy niezgodnosci typow.... :/

Niemniej moim skromnym zdaniem ObjectPascal jakiś bardziej przejrzysty mi się wydaje i bardziej "humanistyczny" niż Java...

0

Przy takiej znajomości i rozumieniu Javy nie powinieneś się wypowiadać na jej temat.

             String line = "";
             StringBuilder oldtext = new StringBuilder("");
             // w pętli odczytujemy linijka po linijce do końca pliku
             while((line = reader.readLine()) != null)
                 {
                 oldtext.append(line + "\r\n");
             }

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