Mam pytanie o powyższej treści co jest szybsze, dokonałem bowiem testów wydajnościowych dla porównania dwóch identycznych aplikacji, jednej napisanej w ASP.NET MVC z użyciem EF6 struktura tej aplikacji zbudowana jest z czterech modułów
Modułu Danych
Modułu Repozytorium
Modułu Serwisów
Modułu Web MVC
Druga aplikacja została napisana w JEE, jej struktura jest typowa dla JEE czyli kontrolery, ziarna EJB, facade, Java Web Application z użyciem EclipseLink.
Tryb wczytania encji, w obu aplikacjach był ustawiony na LAZY.
Aplikację ASP.NET wdrożyłem na serwer IIS przy pomocy opcji Publish w Visual Studio i testowałem na bazie utworzonej w MS SQL Server.
Do tej samej bazy była podłączona też aplikacja Java Web Application wdrożona na serwer GlassFish.
I tu mnie wynik zaskoczył,
tworzenie 1000 rekordów nagłówków dokumentu i 3000 pozycji w pętli, aplikacja Javy wykonała 40 razy szybciej niż aplikacja w ASP.NET
odczytywanie pojedynczych encji czyli 1000 dostawców, 3000 towarów i 1000 dokumentów, aplikacja Javy wykonała 3,5 razy szybciej niż aplikacja w ASP.NET,
przy wczytaniu list encji różnica była mniejsza 1,3 na korzyść Java
Testy wykonane były na maszynie wirtualnej restartowanej po każdym teście
Różnica w szybkości tworzenia rekordów zszokowała mnie to jakiś błąd ? Jakie są Państwa doświadczenia ?
przykład funkcji dodającej dokumenty w ASP.NET
public void testUtworzDokumntyPz()
{
long mIdDostawcy = 1;
long mIdTowaru = 1;
long mIdNaglowkaPz = 1;
decimal ilosc = 1;
decimal cenaZakupuNetto = 1;
int stawkaVat = 7;
ObslugaDanych<TOWARY> TowaryFacade = new ObslugaDanych<TOWARY>(Context);
ObslugaDanych<POZYCJE_PZ> PozycjeDokumentowPZFacade = new ObslugaDanych<POZYCJE_PZ>(Context);
ObslugaDanych<MAGAZYNY> MagazynyFacade = new ObslugaDanych<MAGAZYNY>(Context);
ObslugaDanych<DOSTAWCY> DostawcyFacade = new ObslugaDanych<DOSTAWCY>(Context);
NaglowkiDokumentowPZObslugaDanych NaglowkiDokumentowPZFacade = new NaglowkiDokumentowPZObslugaDanych(Context);
ObslugaDanych<TESTY> TestyFacade = new ObslugaDanych<TESTY>(Context);
NAGLOWKI_PZ NaglowkiPz;
MAGAZYNY magazyn;
List<POZYCJE_PZ> pozycjePzList;
POZYCJE_PZ pozycjaPz;
NAGLOWKI_PZ naglowekPz;
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
for (int mIdMagazynu = 1; mIdMagazynu <= 10; mIdMagazynu++)
{
magazyn = MagazynyFacade.getWiersz(mIdMagazynu);
for (int mNrPz = 1; mNrPz <= 100; mNrPz++)
{
NaglowkiPz = new NAGLOWKI_PZ();
NaglowkiPz.NR_PZ = mNrPz;
NaglowkiPz.ROK_PZ = 2018;
NaglowkiPz.ID_MAGAZYNU = mIdMagazynu;
NaglowkiPz.ID_DOSTAWCY = mIdDostawcy;
NaglowkiPz.DATA_PZ = DateTime.Now;
NaglowkiPz.MAGAZYNY = magazyn;
NaglowkiPz.DOSTAWCY = DostawcyFacade.getWiersz(mIdDostawcy);
NaglowkiDokumentowPZFacade.dodajWiersz(NaglowkiPz);
mIdDostawcy++;
}
}
for (int mIdMagazynu = 1; mIdMagazynu <= 10; mIdMagazynu++)
{
for (int mNrPz = 1; mNrPz <= 100; mNrPz++)
{
pozycjePzList = new List<POZYCJE_PZ>();
naglowekPz = NaglowkiDokumentowPZFacade.getWiersz(mIdNaglowkaPz);
for (short nrPozycji = 1; nrPozycji <= 3; nrPozycji++)
{
pozycjaPz = new POZYCJE_PZ();
pozycjaPz.ID_NAGLOWKA_PZ = mIdNaglowkaPz;
pozycjaPz.NAGLOWKI_PZ = naglowekPz;
pozycjaPz.NR_POZYCJI = nrPozycji;
pozycjaPz.ID_TOWARU = mIdTowaru;
pozycjaPz.TOWARY = TowaryFacade.getWiersz(mIdTowaru);
pozycjaPz.ILOSC = ilosc;
pozycjaPz.ILOSC_AKTUALNA = ilosc;
pozycjaPz.CENA_ZAKUPU_NETTO = cenaZakupuNetto;
pozycjaPz.STAWKA_VAT = stawkaVat;
// ilosc += (decimal)0.01;
// cenaZakupuNetto += (decimal)0.01;
pozycjaPz = PozycjeDokumentowPZFacade.dodajWierszIZwroc(pozycjaPz);
pozycjePzList.Add(pozycjaPz);
mIdTowaru++;
}
naglowekPz.POZYCJE_PZ = pozycjePzList;
NaglowkiDokumentowPZFacade.edytujWiersz(naglowekPz);
mIdNaglowkaPz++;
}
}
watch.Stop();
TESTY test = new TESTY();
test.TYP_TESTU = "DODAJ_PZ";
test.CZAS = watch.ElapsedMilliseconds;
test.CZAS_TAKTOWANIE = watch.ElapsedTicks;
TestyFacade.dodajWiersz(test);
}