Avatar billede trp79 Nybegynder
07. april 2005 - 16:22 Der er 12 kommentarer og
1 løsning

SingleThreadModel bør jeg bruge det(performance)?

Hejsa
Jeg har lavet en servlet som laver et billede ud fra nogle parametre som den modtager. Jeg havde i første omgang ikke implementeret singlethreadmodel, hvilket resulterede i, at billederne ikke blev som de skulle - lidt ligesom om, at parametrerne blev blandet sammen ved flere samtidige kald til servletten. Nu har jeg så implementeret singlethreadmodel, men er det dyrt rent performancemæssigt og burde man istedet komme uden om det på en anden måde?

På forhånd tak, mvh
Torben
Avatar billede arne_v Ekspert
07. april 2005 - 16:42 #1
Det må koste lidt i object creation & destruction.

Næppe specielt mærkbart.

Men det ville undre mig meget hvis det var nødvendigt.

Hvis du kun bruger metode lokale variable i doGet/doPost, så virker det også
en en multithreaded kontekst.
Avatar billede trp79 Nybegynder
07. april 2005 - 17:12 #2
Jeg benytter så metoder og variabler fra en anden pakke, men det ser ud til, at jeg godt kan undgå singlethreadmodel - nu har jeg i hvert fald fået renset ud i den sammenblanding, der ellers opstår...

Kan du komme på et par eksempler, hvor man normalt ville bruge singlethreadmodel?

Smid i øvrigt bare et svar :)
Avatar billede trp79 Nybegynder
07. april 2005 - 17:14 #3
Nej det var da vist et held at den viste noget rigtigt før - nu blanden den det sammen igen - tror bare jeg holder mig til singlethreadmodel for en sikkerheds skyld :)
Avatar billede arne_v Ekspert
07. april 2005 - 17:15 #4
STM er bedre end at fylde din servlet med synchronized
Avatar billede arne_v Ekspert
07. april 2005 - 17:16 #5
svar
Avatar billede arne_v Ekspert
07. april 2005 - 17:16 #6
hvis du poster din servlet kode så kan vi jo kigge på den

det er som sagt meget usædvaneligt at have brug for STM
Avatar billede trp79 Nybegynder
07. april 2005 - 17:25 #7
Det lyder godt :)
Den kommer her:

import.....

public class PieChart extends HttpServlet implements SingleThreadModel
{
  String title;
  String xSize;
  String ySize;
  String[] dataName;
  String[] dataValue;

  public void init(ServletConfig config) throws ServletException
  {
    super.init(config);
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  {
    title = null;
    xSize = null;
    ySize = null;
    dataName = null;
    dataValue = null; 

    response.setContentType("image/jpg");
    title = request.getParameter("title");
    ySize = request.getParameter("ySize");
    xSize = request.getParameter("xSize");
    String[] dataNames = request.getParameterValues("dataName");
    String[] dataValues = request.getParameterValues("dataValue");

//Default values for image size
    int x = 500;
    int y = 300;
   
// Create a simple pie chart
    DefaultPieDataset pieDataset = new DefaultPieDataset();
   
    if(title!=null)
      {}
    else
      title = "No title!";

    if(dataNames!=null && dataValues!=null)
    {
      if(dataNames.length==dataValues.length)
      {
        for(int i=0; i<dataValues.length; i++)
        {
          pieDataset.setValue(dataNames[i], new Double(dataValues[i]));
        }       
      }
      else
        pieDataset.setValue("Not the same amount of DataNames and DataValues",0);
    }
    else
        pieDataset.setValue("No DataNames and DataValues",0);

    JFreeChart chart = ChartFactory.createPieChart
    (title, // Title
    pieDataset, // Dataset
    true, // Show legend
    true, // Use tooltips
    false // Configure chart to generate URLs?
    );

    if(xSize!=null && ySize!=null)
    {
      x = Integer.parseInt(xSize);
      y = Integer.parseInt(ySize);
    }

    BufferedImage bi = chart.createBufferedImage(x, y);

    try {
      ChartUtilities.writeBufferedImageAsJPEG(response.getOutputStream(), bi);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (ImageFormatException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } 
  }
}
Avatar billede arne_v Ekspert
07. april 2005 - 17:39 #8
Ned i doGet med dem her:

  String title;
  String xSize;
  String ySize;
  String[] dataName;
  String[] dataValue;

!!!!
Avatar billede trp79 Nybegynder
07. april 2005 - 17:46 #9
okay det hjalp jo en del! :)
hvordan kan det være at det ikke var nok at sige:
    title = null;
    xSize = null;
    ySize = null;
    dataName = null;
    dataValue = null;
?
Avatar billede arne_v Ekspert
07. april 2005 - 17:56 #10
Uden STM så er der kun et objekt af typen PieChart, flere tråde kalder doGet metoden
på samme objekt

når de er erklæret som instans variable så betyder det at der kun er en kopi
af dem nemlig for det ene objekt og så kører alle trådene på den samme kopi og
det går galt

de lokale variable i metoden bliver der derimod oprettte en kopi af for
hvert kald til metoden og dermed får hver tråd sin egen kopi
Avatar billede trp79 Nybegynder
07. april 2005 - 18:00 #11
Forrygende forklaring Arne - det var jeg slet ikke klar over :)

Nu vi er ved performancen, så er der vel ikke rigtigt mere at optimere, hvis alt skal erklæres i metoden?
Avatar billede arne_v Ekspert
07. april 2005 - 18:45 #12
Det tror jeg ikke.

Jeg vil tro at det er Tomcat og JFreeChart koden som bruger >98% af CPU og ikke
din kode.
Avatar billede trp79 Nybegynder
07. april 2005 - 22:01 #13
Det er super Arne, så håber jeg at folkene bag JFreeChart har gjort det godt :)

Du får mange tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester