Lazarus (FPC) vs Java

Odpowiedz Nowy wątek
2011-08-25 01:04
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...

Kwestia optymalizacji, założę się że niektórzy daliby radę przyśpieszyć Javę do 2 albo 1 sekundy. - msm 2011-08-25 07:32

Pozostało 580 znaków

2011-08-25 04:51
Koper
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.

Jakieś konkrety pls, "padaka" i "cool" nie są dobrym określeniem funkcjonalności / wydajności / popularności softu. - vpiotr 2011-08-25 08:29

Pozostało 580 znaków

2011-08-25 16:20
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

Pozostało 580 znaków

2011-08-25 18:03
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)

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2011-08-25 18:04

Pozostało 580 znaków

2011-08-25 18:54
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.

edytowany 1x, ostatnio: 0x200x20, 2011-08-25 18:57

Pozostało 580 znaków

2011-08-25 20:07
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);
        }
 

Pozostało 580 znaków

2011-08-25 20:24
bo
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.

Pozostało 580 znaków

2011-08-25 20:26
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ć?

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
3. może chce mieć możliwość replace'a znaków nowych lini (i to co po nich nastąpi) - 0x200x20 2011-08-25 20:30
No w sumie tak, brałem to przez chwilę pod uwagę, ale wydawało mi się to zbyt dziwne :] - Wibowit 2011-08-25 20:42

Pozostało 580 znaków

2011-08-25 22:49
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...

edytowany 1x, ostatnio: LOSMARCELOS, 2011-08-25 22:50

Pozostało 580 znaków

2011-08-25 23:01
bo
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");
             }

Pozostało 580 znaków

2011-08-25 23:11
0
bo napisał(a)

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");
}

Aaaa.. dzieki :)

Po zmianach znów zrobie porównianie...
Zmieniłem kod... No teraz po kilku próbach program w Javie okazał... się minimalnie szybszy niż ten skompilowany w FPC :)
Czyli przekonałem się na własnej skórze, ile zależy od umiejętności wykorzystania języka...
:)
Będę mieć chwilę czasu przepisze kod na C/C++

edytowany 2x, ostatnio: LOSMARCELOS, 2011-08-25 23:31

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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