"It's also important to remember that speed is not everything. If you took the #1 top engine in the world and rewrote it in C# or Java, it would still be one of the top engines."
See the proof here:
https://github.com/bpfliegel/Portfish
For me what seems to be the most common problem when implementing a chess engine is C# is memory management. Every second we could create 10+ million objects, which puts a horrible pressure on the GC, so always reuse your objects, never recreate them (see the ObjectBroker.cs for a possible solution).
C vs C# speed ratio was at the end 1:2,7 in case of Portfish.
Good luck!
Balint
Question About CPP-C#, Performance, and Square Represenation
Moderators: hgm, Rebel, chrisw
-
- Posts: 71
- Joined: Fri Mar 16, 2012 10:16 am
-
- Posts: 102
- Joined: Sun Sep 09, 2007 6:32 am
Re: Question About CPP-C#, Performance, and Square Represena
Hi Balint, that is very interesting! Do you know what the ELO difference is between Stockfish and Portfish? If Stockfish is about 2.7 times faster, I would guess the ELO difference is around 200 or so?bpfliegel wrote:"It's also important to remember that speed is not everything. If you took the #1 top engine in the world and rewrote it in C# or Java, it would still be one of the top engines."
See the proof here:
https://github.com/bpfliegel/Portfish
For me what seems to be the most common problem when implementing a chess engine is C# is memory management. Every second we could create 10+ million objects, which puts a horrible pressure on the GC, so always reuse your objects, never recreate them (see the ObjectBroker.cs for a possible solution).
C vs C# speed ratio was at the end 1:2,7 in case of Portfish.
Good luck!
Balint
-
- Posts: 71
- Joined: Fri Mar 16, 2012 10:16 am
Re: Question About CPP-C#, Performance, and Square Represena
I think it is less (around 80 ELO), as it is stronger as Junior and Spike - well, according to my tests. So far, no real professional testing was carried out - I hope I start flaming and someone will test it for goodrreagan wrote:Hi Balint, that is very interesting! Do you know what the ELO difference is between Stockfish and Portfish? If Stockfish is about 2.7 times faster, I would guess the ELO difference is around 200 or so?bpfliegel wrote:"It's also important to remember that speed is not everything. If you took the #1 top engine in the world and rewrote it in C# or Java, it would still be one of the top engines."
See the proof here:
https://github.com/bpfliegel/Portfish
For me what seems to be the most common problem when implementing a chess engine is C# is memory management. Every second we could create 10+ million objects, which puts a horrible pressure on the GC, so always reuse your objects, never recreate them (see the ObjectBroker.cs for a possible solution).
C vs C# speed ratio was at the end 1:2,7 in case of Portfish.
Good luck!
Balint
Cheers, Balint
-
- Posts: 71
- Joined: Fri Mar 16, 2012 10:16 am
Re: Question About CPP-C#, Performance, and Square Represena
Erik, doesn't yield kill your performance? I also experimented with it (sounds logical), but had disappointing results...emadsen wrote:You can check out the source code to my engine for comparison. Link in my signature. Roughly equal in strength to TSCP. I have unpublished changes that add another 100 elo. Mostly due to an incremental move generator (hash move, captures of queens, then captures of rooks, etc... then non captures) which saves time if a capture causes a beta cutoff. I implemented the incremental move generator using C# enumerators and the yield statement. Very clean. Will post code in a few days.
-
- Posts: 71
- Joined: Fri Mar 16, 2012 10:16 am
Re: Question About CPP-C#, Performance, and Square Represena
Sorry, wanted to say -120 ELO (was absent in school, when they taught substraction). It is still less than expected by myself.bpfliegel wrote:I think it is less (around 80 ELO), as it is stronger as Junior and Spike - well, according to my tests. So far, no real professional testing was carried out - I hope I start flaming and someone will test it for goodrreagan wrote:Hi Balint, that is very interesting! Do you know what the ELO difference is between Stockfish and Portfish? If Stockfish is about 2.7 times faster, I would guess the ELO difference is around 200 or so?bpfliegel wrote:"It's also important to remember that speed is not everything. If you took the #1 top engine in the world and rewrote it in C# or Java, it would still be one of the top engines."
See the proof here:
https://github.com/bpfliegel/Portfish
For me what seems to be the most common problem when implementing a chess engine is C# is memory management. Every second we could create 10+ million objects, which puts a horrible pressure on the GC, so always reuse your objects, never recreate them (see the ObjectBroker.cs for a possible solution).
C vs C# speed ratio was at the end 1:2,7 in case of Portfish.
Good luck!
Balint
Cheers, Balint
Best, Balint
-
- Posts: 434
- Joined: Thu Apr 26, 2012 1:51 am
- Location: Oak Park, IL, USA
- Full name: Erik Madsen
Re: Question About CPP-C#, Performance, and Square Represena
I don't know. I haven't tested it extensively. The C# yield statement frees me from having to track state inside an enumerator. So I get the benefit of staged move generation (faster compared to generating all moves) without complicating the code. Considering my goal is to write a bug-free chess program from scratch, of modest playing strength- this is good enough for me.Erik, doesn't yield kill your performance? I also experimented with it (sounds logical), but had disappointing results.
I'd imagine your task is quite different. You're converting a world class codebase to another programming language. I get to look for big performance wins. You inherited hundreds of performance wins. Your job is to avoid performance losses
My C# chess engine: https://www.madchess.net
-
- Posts: 71
- Joined: Fri Mar 16, 2012 10:16 am
Re: Question About CPP-C#, Performance, and Square Represena
You put it into a quite interesting perspective. But it is quite correct I have to say - and was not an easy task at allemadsen wrote:You inherited hundreds of performance wins. Your job is to avoid performance losses
-
- Posts: 434
- Joined: Thu Apr 26, 2012 1:51 am
- Location: Oak Park, IL, USA
- Full name: Erik Madsen
Re: Question About CPP-C#, Performance, and Square Represena
Balint,
No doubt it was a lot of work. Every language / framework has its own pitfalls, performance traps, and counter-intuitive behaviors.
The performance you get with C# is quite impressive, though not surprising to me. It is often the case that people tout an issue of importance on the margin and promote it as if it's the essential thing. Usually this is due to the triumph of marketing (a novice rider buying an expensive bicycle) but sometimes it's done to avoid self criticism (it can't be my code, it must be the language).
I have no doubt that among high-level languages, C and C++ compilers produce the fastest machine code. But there's more to writing fast code than selecting a programming language. The quality and efficiency of data structures / algorithms have a much greater impact on performance than choice of programming language.
-Erik
No doubt it was a lot of work. Every language / framework has its own pitfalls, performance traps, and counter-intuitive behaviors.
The performance you get with C# is quite impressive, though not surprising to me. It is often the case that people tout an issue of importance on the margin and promote it as if it's the essential thing. Usually this is due to the triumph of marketing (a novice rider buying an expensive bicycle) but sometimes it's done to avoid self criticism (it can't be my code, it must be the language).
I have no doubt that among high-level languages, C and C++ compilers produce the fastest machine code. But there's more to writing fast code than selecting a programming language. The quality and efficiency of data structures / algorithms have a much greater impact on performance than choice of programming language.
-Erik
My C# chess engine: https://www.madchess.net
-
- Posts: 859
- Joined: Mon Aug 10, 2009 10:05 pm
- Location: Italy
- Full name: Stefano Gemma
Re: Question About CPP-C#, Performance, and Square Represena
I suggest you to create static array of the objects that you use frequently and then just assign values to free ones, instead of creating new objects. I use two array: one for nodes and one for moves. When i store a move, i write the data in a move object then increment the node index (or the node pointer) to access the next move. The same i do for nodes. For any node, keep the index to the first move object and maybe to the last (but this one is equal to the first of the following node). Because move and node are the more created/deleted objects, this could give you a big speed-up. I use this way to do since my assembly programs and is good even for new C++ engine.
-
- Posts: 741
- Joined: Tue May 22, 2007 11:13 am
Re: Question About CPP-C#, Performance, and Square Represena
Hi Erik,emadsen wrote:The C# yield statement frees me from having to track state inside an enumerator. So I get the benefit of staged move generation (faster compared to generating all moves) without complicating the code. Considering my goal is to write a bug-free chess program from scratch, of modest playing strength- this is good enough for me.
IIRC, in on of your first posts you mentioned that your source code can be downloaded from your website, but I can't seem to locate it. Even though I'm programming in C++, I'm interested in how the yield method would simplify code for move generation. If you could provide a link or code snippet, that would be great!
Rein