nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

Drei kleine Fragen

X-FaceVon: Markus Schaber (leafnode.use-net@schabi.de) [Profil]
Datum: 22.04.2009 22:44
Message-ID: <20090422224418.4b0ef1cd@schabi.de>
Newsgroup: de.comp.os.ms-windows.programmer
--MP_/GYz3IJKhuKrI/vXIMGMoXZP
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hallo,

Ich hab drei kleine Fragen zu VS / .NET / C#:

1. Wie kann ich das "generation 0 memory" der CLR
vergrößern? Ich
habe
Geometrieberechnungen (mit NetTopologySuite / NTS), die sehr viele
Temporärobjekte erzeugen. Laut Prozess Monitor führt das
dazu, da
ss ich
über 100 Generation 0, ca. 30-50 Generation 1 und noch ca. 5 Generation
2 Garbage Collections pro Sekunde habe. Ich deute das so, dass ein
Großteil der Temporärobjekte bis in die Generation 2
"überle
bt", bevor
er dann doch abgeräumt wird.

Ich vermute, dass für die 1er und 2er Generation ein globaler Lock
gehalten werden muss, jedenfalls kann ich mir nur so erklären, dass die
4 Threads auf den 4 CPUs nur insgesamt ca. 50-60% CPU-Last erzeugen.
Lasse ich ähnliche Berechnungen in 4 Prozessen mit je 1 Thread laufen,
habe ich 100% CPU-Last. I/O ist praktisch 0, auch kein Swappen (der
Prozess braucht ein paar hundert MB, die Maschine hat Vista64 mit 8
Gig).


2. Wenn ich meine Applikation aus Visual Studio heraus zum Debuggen
starte, wie kann ich dann erreichen, dass mittels System.Diagnostics.
Process.start() gestartete Sub-Prozesse auch automatisch an den
Debugger von Visual Studio "attached" sind? Ich weiß, dass Visual
Studio mit mehreren Prozessen gleichzeitig umgehen kann, da man übers
Kontext-Menu weitere Prozesse starten kann.


3. Ich habe eine Funktion, die zwei Listen vergleicht, und versuche,
eine optimierte Version zu basteln, die genommen wird, wenn die
Listen-Inhalte IEqualtable implementieren. (Siehe Anhang.) Ich habe zwei
Versuche gemacht, der mit "where" führt dazu, dass das Programm
nicht
compiliert. VS behauptet, es gäbe bereits eine Funktion mit der
gleichen Signatur, MonoDevelop sagt mir, der Call sei ambigous. Die
zweite Version mit IList<IEquatable<T>> compiliert, dann wird aber
gegen die nicht optimierte Ursprungsversion gelinkt.

Bin ich von C++ Templates verseucht? Wie krieg ich das ans Laufen?


Vielen Dank,
Markus

--
"A patched buffer overflow doesn't mean that there's one less way
attackers can get into your system; it means that your design process
was so lousy that it permitted buffer overflows, and there are probably
thousands more lurking in your code." - Bruce Schneier


--MP_/GYz3IJKhuKrI/vXIMGMoXZP
Content-Type: text/x-csharp; name=Main.cs
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=Main.cs

using System;
using System.Collections.Generic;

namespace GenericTemplate {
class MainClass	{
public static bool SequenceEquals<T>(IList<T> a, IList<T> b) {
Console.WriteLine("Plain Version");
if (a.Count != b.Count)	return false;
for (int i=0; i < a.Count; i+=1) if (Equals(a[i],b[i])=úlse) return false;
return true;
}

public static bool SequenceEquals<T>(IList<T> a, IList<T> b) where
T:IEquatable<T> {
Console.WriteLine("Where version Version");
if (a.Count != b.Count)	return false;
for (int i=0; i < a.Count; i+=1) if (a[i].Equals(b[i])=úlse) return false;
return true;
}

public static bool SequenceEquals<T>(IList<IEquatable<T>> a,
List<IList<T>> b) {
Console.WriteLine("List<IEqualtable<T>> Version");
if (a.Count != b.Count)	return false;
for (int i=0; i < a.Count; i+=1) if (a[i].Equals(b[i])=úlse) return false;
return true;
}

public static void Main(string[] args)
{
List<String> sample = new List<String>(new
string[]{"hallo","welt"});
Console.WriteLine(SequenceEquals(args, sample));
}
}
}
--MP_/GYz3IJKhuKrI/vXIMGMoXZP--


[ Auf dieses Posting antworten ]

Antworten