43
Witam wszytkich szanownych użytkowników - od jakiegoś zachodzę w głowę jak to możliwe, że java jest szybsza od assemblera - brzmi irracjonalnie, ale już tłumaczę o co chodzi. Pytanie do wyjadaczy programowania

Zaimplementowałem sortowanie bąbelowe w javie i assemblerze (linux) na tablicy 10000 elementów posortowanych malejący (wariant najgorszy dla bubble sorta) i zmierzyłem czas w jakim tablica będzie posortowana w javie i assemblerze - sam proces sortowania.
dlaczego java jest szybsza od assemblera?
Kod źródłowy assembler:  https://raw.githubusercontent.com/HatimHibrahim/bubblesort_speedtest/refs/heads/main/asm/main.asm
Kod źródłowy java: https://raw.githubusercontent.com/HatimHibrahim/bubblesort_speedtest/refs/heads/main/java/main.java

kompilacja i uruchomienie:
- assembler (x86_64, linux)
    > fasm main.asm main
    > ./main
- java:
   > javac main.java
   > java main

Szukałem w internecie - co może być przyczyną, pytałem AI - ale odpowiedź nie jest dla mnie zadowalająca - kompilator javy stosuje optymalizacje kodu.
Sprawdziłem to - zdekompilowałem plik main.class - było ok - mniej-więcej jak w kodzie źródłowym, żadnych optimalizacji w stylu posortowania tablicy i wypisania wyniku.

Czy są jakieś rozsądne wyjaśnienia tego? 
Obrazek zwinięty kliknij aby rozwinąć ▼
22
No jasny gwint mnie zaro szczeli...

Dobra tam, przejdzmy do konkretow. 

Juz od jakiegos czasu probuje nauczyc sie programowac. 
Za jezyk obralem sobie Jave a srodowisko IntelijIdea.

Umiem juz pisac samodzielnie konsolowe gierki typu wisielec, jakies RPGi kalkulatory i tego typu rzeczy zawierajace klasy dziedziczne, petle, rozne metody itp- czuje sie juz na tyle pewnie, ze za nastepny cel nauki obralem sobie za nastepny krok probe stworzenia czegos, co juz ma jakies okienku. Czegos, co juz ma jakis wyglad, co juz wyglada jak jakas aplikacja. 

Jestem samoukiem. Ucze sie glownie za pomoca filmikow z YT i ChatGPT. Przejdzmy do mojego problemu:
Chce sobie dodac swoj wlasny guzik, tzn. zrobilem testowy guzik w paincie i chce by moj button mial jego grafike. No i ogolnie udalo mi sie to zrobic, ale kurwa... Jakby to powiedziec, powierzchnia "funkcjonalna" tego guzika wykracza poza obszar tegoz oto guzika, wyglada dto tak:

drzawa
JAK ZROBIC, BY TYLKO TEN GUZIK DZIALAL JAKO GUZIK? 
A nie ze jak klikne obok to dalej uznaje go za guzik mimo ze nie ma nim byc. Probowalem juz roznych cudow i mi nie wychodzi.

Moze komus sie nudzi i poprawi mi kod i wskaze na czym polegal blad. Z zadnymi bibliotekami typu Swing itp jeszcze nia mialem do czynienia, dopiero sie wdrazam w ten temat.
Ponizej zamieszczam kod :
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Main extends JFrame implements KeyListener {

    private int playerX = 50;
    private int playerY = 50;

    public Main() {
        setTitle("Prosta Gra RPG");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        addKeyListener(this);

        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        ImageIcon obrazek = new ImageIcon("D:\\Studio\\guz.png");
        JButton guzikZObrazkiem = new JButton(obrazek);
        guzikZObrazkiem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(Main.this, "Kliknięto guzik z obrazkiem!");
            }
        });
        guzikZObrazkiem.setPreferredSize(new Dimension(obrazek.getIconWidth(), obrazek.getIconHeight()));
        guzikZObrazkiem.setBorderPainted(false);

        setLayout(new BorderLayout());

        JPanel panelGry = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                rysujPlansze(g);
                g.setColor(Color.BLUE);
                g.fillRect(playerX, playerY, 20, 20);
            }
        };
        add(guzikZObrazkiem, BorderLayout.SOUTH);
        add(panelGry, BorderLayout.CENTER);
    }

    private void rysujPlansze(Graphics g) {
        g.setColor(Color.RED);
        g.drawRect(25, 50, 200, 160);

        g.setColor(Color.BLACK);
        g.drawString("Ekwipunek:", 10, 415);

        g.setColor(Color.DARK_GRAY);
        g.drawLine(430, 220, 121, 55);

        g.setColor(Color.DARK_GRAY);
        g.drawLine(433, 223, 124, 58);

        g.setColor(Color.DARK_GRAY);
        g.drawLine(0, 400, 1111, 400);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Main gra = new Main();
            gra.setVisible(true);
        });
    }

    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            playerX -= 20;
        } else if (key == KeyEvent.VK_RIGHT) {
            playerX += 20;
        } else if (key == KeyEvent.VK_UP) {
            playerY -= 20;
        } else if (key == KeyEvent.VK_DOWN) {
            playerY += 20;
        }
        repaint();
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }
}
Obrazek zwinięty kliknij aby rozwinąć ▼
29
Cześć dzidki.
Ostatnio szukam jakiegoś kursu JAVA (stacjonarny/online) i nie mogę zdecydować jaki. Opinie na temat szkół programowania są w większości tragiczne i tzw. bootcamp-y są obrzucane gównem od góry do dołu. Jaka jest prawda? Opłaca się to w ogóle? Czy ktokolwiek mnie zatrudni po takim kursie? Jakie macie doświadczenia?

PS
Ogólnie mam styczność z programowaniem aplikacji internetowych już od kilku lat, ale nigdy nie pracowałem przy tym nigdzie.
Nie jestem po żadnej szkole informatycznej.

Wypierdalam
Obrazek zwinięty kliknij aby rozwinąć ▼
0.072529077529907