Arşiv

Etiketlenen yazılar loop

Uygulamanın Referans Listesini Almak

20 Kasım 2011 Yorum yapılmamış

Çalışma zamanında (Run-Time) uygulamanın referans olarak kullandığı assembly‘lerin (dll) listesini almak için aşağıdaki LINQ sorgusunu kullanabilirsiniz;

var assemblies = from assemblyName in Assembly.GetExecutingAssembly().GetReferencedAssemblies()
let assembly = Assembly.Load(assemblyName)
let companies = assembly.GetCustomAttributes(typeof(AssemblyCompanyAttribute), false)
where companies.Length > 0 && (companies[0] as AssemblyCompanyAttribute).Company != "Microsoft Corporation"
select assembly;

Assembly sınıfının static GetExecutingAssembly() method’unu kullanarak çalışan assembly‘ye ulaşabiliriz.

GetReferencedAssemblies() method’u ilgili Assembly‘nin referans olarak kullandığı assembly‘lerin listesini döndürür.

Assembly sınıfının static Load() method’u ile ilgili assembly hafızaya yüklenir.

GetCustomAttributes() method’u ile ilgili assembly‘nin çeşitli meta bilgileri sorgulanabilir. Örneğin;

AssemblyCompanyAttribute bilgisini aldıktan sonra, Microsoft Corporation değerinden farklı olduğunu kontrol ederek, Microsoft firması haricinde firmaların referans assembly‘lerini bulabiliriz.

Son olarak, basit bir foreach döngüsü ile assembly listesini ekrana yazdırabiliriz;

foreach (var assembly in assemblies)
{
	Console.WriteLine(assembly.FullName);
}

For – ForEach – List.ForEach performans karşılaştırması

31 Ekim 2010 1 yorum

Bir dizinin tüm elemanları üzerinde bir aksiyon gerçekleştirmemiz gerektiğinde, sıklıkla şu üç yoldan birini kullanırız;

  • For döngüsü
  • ForEach Döngüsü
  • List generic sınıfının ForEach extension method’u

Şimdi basit bir örnek ile bu üç yöntemi karşılaştıralım (*);

(* Not : Karşılaştırmalar; Windows7 64bit kurulu, Core2Duo 3.0 GHz ve 4 GB Ram’li bilgisayarımda yapılmıştır. Sadece fikir verme amaçlıdır, farklı durumlarda faklı sonuçlar ile karşılaşılabilir.)

Öncelikle parametre olarak Generic List (List<T>) alan üç tane method yazalım;

private static long ToplamFor(List<int> Liste)
{
	long Sonuc = 0;
	int ListeAdet = Liste.Count;

	for (int iLoop = 0; iLoop < ListeAdet; iLoop++)
		Sonuc += Liste[iLoop];

	return Sonuc;
}

private static long ToplamForEach(List<int> Liste)
{
	long Sonuc = 0;

	foreach (int Rakam in Liste)
		Sonuc += Rakam;

	return Sonuc;
}

private static long ToplamForEachExtension(List<int> Liste)
{
	long Sonuc = 0;

	Liste.ForEach(Rakam => Sonuc += Rakam);

	return Sonuc;
}

Aynı testi 10 defa gerçekleştirip, ortalamasını alacak bir test fonksiyonu yazalım. Yazacağımız fonksiyonu test listesinde olacak eleman adedini parametre olarak alacak;

private static void Testler(int ListeElemanAdet)
{
	List<int> ForSureler = new List<int>();
	List<int> ForEachSureler = new List<int>();
	List<int> ForEachExtensionSureler = new List<int>();

	List<int> TestVerisi = Enumerable.Range(0, ListeElemanAdet).ToList();

	Stopwatch sw = new Stopwatch();

	for (int iLoop = 0; iLoop < 10; iLoop++)
	{
		sw.Restart();
		ToplamFor(TestVerisi);
		sw.Stop();
		ForSureler.Add(sw.ElapsedTicks);

		sw.Restart();
		ToplamForEach(TestVerisi);
		sw.Stop();
		ForEachSureler.Add(sw.ElapsedTicks);

		sw.Restart();
		ToplamForEachExtension(TestVerisi);
		sw.Stop();
		ForEachExtensionSureler.Add(sw.ElapsedTicks);
	}

	Console.WriteLine("For Döngüsü ({0} Eleman) : {1}", ListeElemanAdet, ForSureler.Average());

	Console.WriteLine("ForEach Döngüsü ({0} Eleman) : {1}", ListeElemanAdet, ForEachSureler.Average());

	Console.WriteLine("ForEach Extension ({0} Eleman) : {1}", ListeElemanAdet, ForEachExtensionSureler.Average());
}

Artık uygulamamızın test fonksiyonunu kullanacak son kod parçasını yazabiliriz;

public static void Main(string[] args)
{
	Console.WriteLine("Test Başladı");

	Testler(1000);
	Testler(5000);
	Testler(10000);
	Testler(50000);
	Testler(100000);
	Testler(500000);
	Testler(1000000);
	Testler(5000000);
	Testler(10000000);
	Testler(50000000);

	Console.WriteLine("Test Bitti");

	Console.ReadLine();
}

Bakalım yaptığımız testler nasıl sonuç vermiş;

For - ForEach - ForEach extension Performans Karşılaştırması / Ekran Görüntüsü

Sonuçlardan aşağıdaki tabloyu çıkarttım;

Test Verisi For ForEach ForEach Extension
1.000 71,1 121,5 79,7
5.000 34,3 92,2 55,6
10.000 70,0 185,1 110,4
50.000 349,3 918,4 568,3
100.000 715,2 1.902,7 1.159,0
500.000 3.583,3 9.379,3 5.600,0
1.000.000 7.260,4 18.877,9 11.242,8
5.000.000 37.927,2 96.096,9 57.845,4
10.000.000 74.553,5 192.621,6 115.559,6
50.000.000 371.698,1 956.394,4 572.776,7

İlk olarak 50.000 elemana kadar olan listeler için karşılaştırma yapalım;

For - ForEach - ForEach extension Performans Karşılaştırması / 50.000 elemana kadar inceleme

Son olarak 50.000.000 elemana kadar olan listeler için karşılaştırma yapalım;

For - ForEach - ForEach extension Performans Karşılaştırması / 50.000.000 elemana kadar inceleme

Bu kodda ne yanlış var? – 4

19 Temmuz 2010 5 yorum

Bowling skorlarını hesaplayan bir uygulama yazıyoruz.

2 oyuncunun 3 oyunda aldığı skorları hesaplayan aşağıdaki kodu yazdık ve çalıştırdık.

Fakat rakamlarda bir terslik var sanki. Sizce problem nedir ve nasıl düzeltebiliriz?

using System;

class Program
{
	static void Main(string[] args)
	{
		int[,] PuanTablosu = { {101, 128, 143}, {123, 115, 116} };

		int OyuncuPuan = 0;

		for (int iLoop = 0; iLoop < = PuanTablosu.GetUpperBound(0); iLoop++)
		{
			for (int yLoop = 0; yLoop <= PuanTablosu.GetUpperBound(1); yLoop++)
			{
				OyuncuPuan += PuanTablosu[iLoop, yLoop];
			}

			Console.WriteLine("Oyuncu {0} skor: {1}", iLoop + 1, OyuncuPuan);
		}

		Console.ReadLine();
	}
}

Kısa Sınav – 12

18 Şubat 2010 2 yorum

Kod yazma yeteneklerimizi ölçebileceğimiz sitelerden Codility‘de test olarak yapabileceğiniz bir soru bulunuyor. Aşağıdaki görselde soruyu görebilirsiniz.

Codility sitesinde yayınlanan demo test

Benim çözümüm devam eden sayfada. Sizde çözümünüzü yazın bakalım.

Devamını oku…