Archivi tag: c#

Benchmark MySQL Connector NET Vs DevArt DotConnect For MySQL

Era da un po’ di tempo che mi chiedevo se l’implementazione di Linq To SQL per mysql di DevArt fosse più efficiente o meno dell’alternativa di casa mysql.

Ho quindi deciso di farmi in casa un benchmark che, sebbene effettuato in modo piuttosto grossolano e rapido ha dato dei risultati abbastanza netti.
Il test è stato eseguito con le seguenti condizioni (da qui capirete che è abbastanza spartano come benchmark):

  • Windows 7 64 BIT
  • mysql 5.1.x 64 BIT per Windows
  • .NET Framework 4.0
  • Utilizzato Cassini al posto di IIS
  • DevArt versione 6.30.185.0
  • mysql Connector NET versione 6.4.4

In pratica ho lanciato due procedure separate con la mia macchina nelle stesse condizioni di lavoro e a distanza di pochissimo tempo, quindi applicativi aperti, musica che suona e via discorrendo :-)

Il test era suddiviso in due componenti, l’esecuzione di 1.000 query su una tabella con campo indicizzato passandogli un valore randomico e l’inserimento di 1.000 record sempre con valori randomici.
In particolare l’inserimento prevedeva il COMMIT ad ogni STATEMENT perché altrimenti non si notava alcuna differenza di performance tra i due drivers.

Di seguito i risultati nudi e crudi:

mysql (utilizzo 27%/30% CPU poi sceso in insert a 13%/15%) 6.4.4

  • Data avvio select: 30/12/2011 18:12:03
  • Data fine select: 30/12/2011 18:12:31
  • Data avvio insert: 30/12/2011 18:12:31
  • Data fine insert: 30/12/2011 18:12:43

DevArt (utilizzo 27%/31% CPU in insert a 13%/17%) 6.30.185.0

  • Data avvio select: 30/12/2011 18:13:21
  • Data fine select: 30/12/2011 18:13:38
  • Data avvio insert: 30/12/2011 18:13:38
  • Data fine insert: 30/12/2011 18:13:44

Tempo SELECT MySQL: 28 secondi
Tempo SELECT DevArt: 17 secondi

Tempo INSERT MySQL: 12 secondi
Tempo INSERT DevArt: 6 secondi

Direi che è abbastanza chiaro che, a parte una lieve differenza nell’utilizzo della CPU (in favore del driver mysql Connector NET meno esoso), la velocità di esecuzione sia delle SELECT che delle INSERT è nettamente in favore di DevArt.

Morale, bene così, almeno non ho toppato driver per un importante progetto che sto sviluppando! :-)

Asp.NET MVC 3 rilasciato, supportato l’engine per le view Razor

Segnalo a tutti quanti la disponibilità di Asp.NET MVC 3.

Ecco quella che secondo me è la principale novità:

Engine View Razor

Hanno introdotto la possibilità (e quindi mantenendo ancora le classiche aspx) di utilizzare come engine per le view il motore razor.
La principale caratteristica che lo rende davvero una novità importante è la semplicità e fluidità con cui si riesce a nestare codice c# o vb all’interno dell’html. Infatti ora non è più necessario aprire il tag <% scrivere il codice chiudere con il tag %> ma si può andare belli sciolti come potete vedere in modo più esaustivo in questo articolo:
http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx

Per maggiori informazioni sulle altre novità (alcune davvero interessanti):

http://www.asp.net/mvc/mvc3

Classe C# per parsing Atom da Blogspot e da PhpBB

Di seguito una semplice classe con due metodi per leggere (o come dicono gli americani, consumare) atom feed.
In entrambi i casi i due metodi ricevono in input l’URL del feed da parsare e ne restituiscono un Dictionary composito (semplicemente perchè mi serviva un tipo di dato di questo tipo).

In teoria sarebbe stato sufficiente l’utilizzo del solo metodo GetAtomItemsBlog() per leggere anche altri Atom, sfortunatamente però il tipo di Atom che esporta PhpBB non viene correttamente letto da questo metodo. Per ovviare al problema ho creato un secondo metodo GetAtomItemsForum() che utilizza la classe SyndicationFeed al posto di Atom10FeedFormatter.
Resta comunque interessante il primo metodo visto che va ad utilizzare la sintassi Linq.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class AtomRssReader
{
    public Dictionary<string , Dictionary<string, string>> GetAtomItemsBlog(string MyUrl)
    {
        XmlReader reader = XmlReader.Create(MyUrl);
        Atom10FeedFormatter atom = new Atom10FeedFormatter();
        Dictionary</string><string , Dictionary<string, string>> Ret = new Dictionary</string><string , Dictionary<string, string>>();
        Dictionary</string><string , string> Temp;
        if (atom.CanRead(reader))
        {
            atom.ReadFrom(reader);
            var items = from item in atom.Feed.Items.OfType<syndicationitem>()
                        select new
                        {
                            Id = item.Id,
                            Title = item.Title.Text,
                            Url = item.Links.Last<syndicationlink>().Uri.AbsoluteUri,
                            Published = item.PublishDate,
                            Updated = item.LastUpdatedTime,
                            Subtitle = item.Summary.Text
                        };
            foreach (var item in items)
            {
                Temp = new Dictionary<string , string>();
                Temp.Add("Title", item.Title);
                Temp.Add("Url", item.Url);
                Temp.Add("Published", Convert.ToString(item.Published.LocalDateTime));
                Temp.Add("Updated", Convert.ToString(item.Updated.LocalDateTime));
                Temp.Add("Subtitle", item.Subtitle);
                Ret.Add(item.Id, Temp);
            }
        }
        reader.Close();

        return Ret;;
    }

    public Dictionary</string><string , Dictionary<string, string>> GetAtomItemsForum(string MyUrl)
    {
        Dictionary</string><string , Dictionary<string, string>> Ret = new Dictionary</string><string , Dictionary<string, string>>();
        XmlReader reader = XmlReader.Create(MyUrl);
        SyndicationFeed feed = SyndicationFeed.Load(reader);
        Dictionary</string><string , string> Temp;

        foreach (var item in feed.Items)
        {
            Temp = new Dictionary</string><string , string>();
            Temp.Add("Title", item.Title.Text);
            Temp.Add("Published", Convert.ToString(item.LastUpdatedTime.LocalDateTime));
            Temp.Add("Updated", Convert.ToString(item.LastUpdatedTime.LocalDateTime));
            Temp.Add("Url", item.Id);
            Temp.Add("Subtitle", ((TextSyndicationContent)item.Content).Text);
            Ret.Add(item.Id, Temp);
        }

        return Ret; ;
    }
}