Example #1
0
File: Program.cs Project: rh/spikes
 private static void Loop(Node node, int level, Action action)
 {
     action();
     //Console.WriteLine("{0}  {1}: {2}", new string(' ', level), node.Name, node.Children.Count);
     foreach (Node child in node.Children)
     {
         Loop(child, level + 2, action);
     }
 }
Example #2
0
File: Node.cs Project: rh/spikes
 public virtual void Add(Node node)
 {
     node.Parent = this;
     children.Add(node);
 }
Example #3
0
File: Program.cs Project: rh/spikes
        private static void Main(string[] args)
        {
            // Logging makes everything very slow!
            //			foreach (string file in Directory.GetFiles(".", "*.log*"))
            //			{
            //				Console.WriteLine("Deleting '{0}'.", file);
            //				File.Delete(file);
            //			}
            //			Console.WriteLine();
            //
            //			XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.config"));

            try
            {
                Dictionary<string, string> properties = new Dictionary<string, string>();
                properties[Environment.ProxyFactoryFactoryClass] = "NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle";

                if (args.Length > 0 && args[0] == "sqlserver")
                {
                    Console.WriteLine("Using SQL Server");
                    properties[Environment.ConnectionDriver] = "NHibernate.Driver.SqlClientDriver";
                    properties[Environment.Dialect] = "NHibernate.Dialect.MsSql2005Dialect";
                    properties[Environment.ConnectionProvider] = "NHibernate.Connection.DriverConnectionProvider";
                    properties[Environment.ConnectionString] = "Server=(local);Initial Catalog=test;Integrated Security=SSPI;";
                }
                else
                {
                    Console.WriteLine("Using SQLite");
                    properties[Environment.ConnectionDriver] = "NHibernate.Driver.SQLite20Driver";
                    properties[Environment.Dialect] = "NHibernate.Dialect.SQLiteDialect";
                    properties[Environment.ConnectionProvider] = "NHibernate.Connection.DriverConnectionProvider";
                    properties[Environment.ConnectionString] = "Data Source=test.db;Version=3;New=False;Compress=True;";
                }

                properties[Environment.CacheProvider] = "NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache";
                properties[Environment.CacheDefaultExpiration] = "120";
                properties[Environment.UseSecondLevelCache] = "true";
                properties[Environment.UseQueryCache] = "true";
                properties[Environment.QuerySubstitutions] = "true=1;false=0";
                properties[Environment.ReleaseConnections] = "on_close";
                properties[Environment.BatchSize] = "2000";
                properties[Environment.GenerateStatistics] = "true";
                //properties[Environment.ShowSql] = "true";

                Configuration cfg = new Configuration();
                cfg.Properties = properties;
                cfg.AddAssembly(typeof(Node).Assembly);

                Console.WriteLine();
                new SchemaExport(cfg).Execute(true, true, false);
                Console.WriteLine();

                const int Count = 5;

                ISessionFactory factory = cfg.BuildSessionFactory();

                List<Guid> ids = new List<Guid>();

                Stopwatch stopwatch = Stopwatch.StartNew();
                using (ISession session = factory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        for (int i = 0; i < Count; i++)
                        {
                            Node inode = new Node(i.ToString());
                            session.Save(inode);
                            for (int j = 0; j < Count + Count; j++)
                            {
                                Node jnode = new Node(string.Format("{0}.{1}", i, j));
                                jnode.Root = inode;
                                inode.Add(jnode);
                                for (int k = 0; k < Count + Count; k++)
                                {
                                    Node knode = new Node(string.Format("{0}.{1}.{2}", i, j, k));
                                    knode.Root = inode;
                                    jnode.Add(knode);
                                    for (int l = 0; l < Count + Count; l++)
                                    {
                                        Node lnode = new Node(string.Format("{0}.{1}.{2}.{3}", i, j, k, l));
                                        lnode.Root = inode;
                                        knode.Add(lnode);
                                    }
                                }
                            }
                            ids.Add(inode.Id);
                        }
                        transaction.Commit();
                    }
                }

                stopwatch.Stop();
                Console.WriteLine("Inserting:      {0,4} ms", stopwatch.ElapsedMilliseconds);
                Console.WriteLine("Total created:   {0}", Node.Count);
                Console.WriteLine("Total inserted:  {0}", factory.Statistics.EntityInsertCount);

                for (int i = 0; i < 2; i++)
                {
                    using (ISession session = factory.OpenSession())
                    {
                        using (ITransaction transaction = session.BeginTransaction())
                        {
                            foreach (Guid id in ids)
                            {
                                stopwatch.Reset();
                                stopwatch.Start();

                                // NOTE: setting the batch-size in the mapping makes this slower!
                                Node node = session.Load<Node>(id);
                                int total = 0;
                                Loop(node, 0, delegate { total++; });

                                stopwatch.Stop();
                                Console.WriteLine("{0}: {1,4} ms ({2} records)", id, stopwatch.ElapsedMilliseconds, total);
                            }

                            transaction.Commit();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("ERROR: " + e);
                return;
            }
        }