* [ruby-core:61452] [ruby-trunk - Feature #9632] [Open] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
@ 2014-03-13 3:26 ` normalperson
2014-03-19 8:26 ` [ruby-core:61593] " Eric Wong
2014-03-19 8:28 ` [ruby-core:61595] [ruby-trunk - Feature #9632] " normalperson
` (11 subsequent siblings)
12 siblings, 1 reply; 20+ messages in thread
From: normalperson @ 2014-03-13 3:26 UTC (permalink / raw
To: ruby-core
Issue #9632 has been reported by Eric Wong.
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
--
http://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:61593] Re: [ruby-trunk - Feature #9632] [Open] [PATCH 0/2] speedup IO#close with linked-list from ccan
2014-03-13 3:26 ` [ruby-core:61452] [ruby-trunk - Feature #9632] [Open] [PATCH 0/2] speedup IO#close with linked-list from ccan normalperson
@ 2014-03-19 8:26 ` Eric Wong
2014-03-30 3:28 ` [ruby-core:61759] " Eric Wong
0 siblings, 1 reply; 20+ messages in thread
From: Eric Wong @ 2014-03-19 8:26 UTC (permalink / raw
To: ruby-core
normalperson@yhbt.net wrote:
> 0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
I'll de-duplicate the CC0 declaration files if allowed to commit this.
The original had symlinks, but I assume symlinks are not allowed in this
source tree for portability.
I really like the Linux-kernel-style of linked-list.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:61595] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
2014-03-13 3:26 ` [ruby-core:61452] [ruby-trunk - Feature #9632] [Open] [PATCH 0/2] speedup IO#close with linked-list from ccan normalperson
@ 2014-03-19 8:28 ` normalperson
2014-03-30 3:28 ` [ruby-core:61760] " normalperson
` (10 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: normalperson @ 2014-03-19 8:28 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Eric Wong.
normalperson@yhbt.net wrote:
> 0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
I'll de-duplicate the CC0 declaration files if allowed to commit this.
The original had symlinks, but I assume symlinks are not allowed in this
source tree for portability.
I really like the Linux-kernel-style of linked-list.
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-45872
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:61759] Re: [ruby-trunk - Feature #9632] [Open] [PATCH 0/2] speedup IO#close with linked-list from ccan
2014-03-19 8:26 ` [ruby-core:61593] " Eric Wong
@ 2014-03-30 3:28 ` Eric Wong
0 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2014-03-30 3:28 UTC (permalink / raw
To: ruby-core
Eric Wong <normalperson@yhbt.net> wrote:
> normalperson@yhbt.net wrote:
> > 0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
>
> I'll de-duplicate the CC0 declaration files if allowed to commit this.
> The original had symlinks, but I assume symlinks are not allowed in this
> source tree for portability.
Updated 0001 patch with deduplicated license files:
http://bogomips.org/ruby.git/patch?id=b5401cdc6f72
I also renamed CCAN_INCLUDES to CCAN_LIST_INCLUDES in common.mk; in case
we import other modules from ccan[1].
[1] - http://ccodearchive.net/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:61760] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
2014-03-13 3:26 ` [ruby-core:61452] [ruby-trunk - Feature #9632] [Open] [PATCH 0/2] speedup IO#close with linked-list from ccan normalperson
2014-03-19 8:28 ` [ruby-core:61595] [ruby-trunk - Feature #9632] " normalperson
@ 2014-03-30 3:28 ` normalperson
2014-04-05 23:37 ` [ruby-core:61870] " Eric Wong
2014-04-05 23:38 ` [ruby-core:61871] " normalperson
` (9 subsequent siblings)
12 siblings, 1 reply; 20+ messages in thread
From: normalperson @ 2014-03-30 3:28 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Eric Wong.
Eric Wong <normalperson@yhbt.net> wrote:
> normalperson@yhbt.net wrote:
> > 0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
>
> I'll de-duplicate the CC0 declaration files if allowed to commit this.
> The original had symlinks, but I assume symlinks are not allowed in this
> source tree for portability.
Updated 0001 patch with deduplicated license files:
http://bogomips.org/ruby.git/patch?id=b5401cdc6f72
I also renamed CCAN_INCLUDES to CCAN_LIST_INCLUDES in common.mk; in case
we import other modules from ccan[1].
[1] - http://ccodearchive.net/
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-45994
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:61870] Re: [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
2014-03-30 3:28 ` [ruby-core:61760] " normalperson
@ 2014-04-05 23:37 ` Eric Wong
2014-05-10 23:50 ` [ruby-core:62519] " Eric Wong
0 siblings, 1 reply; 20+ messages in thread
From: Eric Wong @ 2014-04-05 23:37 UTC (permalink / raw
To: ruby-core
normalperson@yhbt.net wrote:
> Updated 0001 patch with deduplicated license files:
> http://bogomips.org/ruby.git/patch?id=b5401cdc6f72
Any comment? My main concern is it's a large import of new code;
but it is also highly reusable. I'll commit in 2-4 weeks if no response.
The 0002 patch can wait longer.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:61871] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (2 preceding siblings ...)
2014-03-30 3:28 ` [ruby-core:61760] " normalperson
@ 2014-04-05 23:38 ` normalperson
2014-05-10 23:58 ` [ruby-core:62520] " normalperson
` (8 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: normalperson @ 2014-04-05 23:38 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Eric Wong.
normalperson@yhbt.net wrote:
> Updated 0001 patch with deduplicated license files:
> http://bogomips.org/ruby.git/patch?id=b5401cdc6f72
Any comment? My main concern is it's a large import of new code;
but it is also highly reusable. I'll commit in 2-4 weeks if no response.
The 0002 patch can wait longer.
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-46087
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62519] Re: [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
2014-04-05 23:37 ` [ruby-core:61870] " Eric Wong
@ 2014-05-10 23:50 ` Eric Wong
0 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2014-05-10 23:50 UTC (permalink / raw
To: ruby-core
Eric Wong <normalperson@yhbt.net> wrote:
> Any comment? My main concern is it's a large import of new code;
> but it is also highly reusable. I'll commit in 2-4 weeks if no response.
> The 0002 patch can wait longer.
Committed as r45913. Hopefully nothing breaks, I tested extensively
on my "production" server. Sorry for the delay, was busy.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62520] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (3 preceding siblings ...)
2014-04-05 23:38 ` [ruby-core:61871] " normalperson
@ 2014-05-10 23:58 ` normalperson
2014-05-11 10:07 ` [ruby-core:62523] " ko1
` (7 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: normalperson @ 2014-05-10 23:58 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Eric Wong.
Eric Wong <normalperson@yhbt.net> wrote:
> Any comment? My main concern is it's a large import of new code;
> but it is also highly reusable. I'll commit in 2-4 weeks if no response.
> The 0002 patch can wait longer.
Committed as r45913. Hopefully nothing breaks, I tested extensively
on my "production" server. Sorry for the delay, was busy.
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-46679
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62523] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (4 preceding siblings ...)
2014-05-10 23:58 ` [ruby-core:62520] " normalperson
@ 2014-05-11 10:07 ` ko1
2014-05-11 10:58 ` [ruby-core:62525] " Eric Wong
2014-05-11 10:08 ` [ruby-core:62524] " ko1
` (6 subsequent siblings)
12 siblings, 1 reply; 20+ messages in thread
From: ko1 @ 2014-05-11 10:07 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Koichi Sasada.
Sorry for late response.
Just curious (I'm not against of this change).
1. How performance improved?
2. Should we modify ccan/* files? Or should we sync with originals?
3. What mean the name "CCAN"?
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-46681
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62524] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (5 preceding siblings ...)
2014-05-11 10:07 ` [ruby-core:62523] " ko1
@ 2014-05-11 10:08 ` ko1
2014-09-13 23:55 ` [ruby-core:65022] " Eric Wong
2014-05-11 10:58 ` [ruby-core:62526] " normalperson
` (5 subsequent siblings)
12 siblings, 1 reply; 20+ messages in thread
From: ko1 @ 2014-05-11 10:08 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Koichi Sasada.
4. Should we use it on compile.c?
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-46682
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62525] Re: [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
2014-05-11 10:07 ` [ruby-core:62523] " ko1
@ 2014-05-11 10:58 ` Eric Wong
2014-05-11 11:02 ` [ruby-core:62527] " Eric Wong
0 siblings, 1 reply; 20+ messages in thread
From: Eric Wong @ 2014-05-11 10:58 UTC (permalink / raw
To: Ruby developers
ko1@atdot.net wrote:
> 1. How performance improved?
There is less pointer chasing for iteration:
Before: st_table_entry->rb_thread_t->st_table_entry->rb_thread_t ...
After: rb_thread->rb_thread ...
This is made possible by the container_of macro.
I plan to use container_of in method/constant/symbol table, too
(ihash in Feature #9614).
> 2. Should we modify ccan/* files? Or should we sync with originals?
I probably best to sync with originals. I removed parts of
ccan/str/str.h we are not using, but we can use more of str.h later.
I may also put ihash in CCAN so other projects may use it easily.
But I am not sure about the name "ihash".
> 3. What mean the name "CCAN"?
Comprehensive C Archive Network - ccodearchive.net
> 4. Should we use it on compile.c?
Maybe. I do not know compile.c well enough...
If we can reduce allocations and pointer chasing without regressions,
we should use it.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62526] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (6 preceding siblings ...)
2014-05-11 10:08 ` [ruby-core:62524] " ko1
@ 2014-05-11 10:58 ` normalperson
2014-05-11 11:09 ` [ruby-core:62528] " normalperson
` (4 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: normalperson @ 2014-05-11 10:58 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Eric Wong.
ko1@atdot.net wrote:
> 1. How performance improved?
There is less pointer chasing for iteration:
Before: st_table_entry->rb_thread_t->st_table_entry->rb_thread_t ...
After: rb_thread->rb_thread ...
This is made possible by the container_of macro.
I plan to use container_of in method/constant/symbol table, too
(ihash in Feature #9614).
> 2. Should we modify ccan/* files? Or should we sync with originals?
I probably best to sync with originals. I removed parts of
ccan/str/str.h we are not using, but we can use more of str.h later.
I may also put ihash in CCAN so other projects may use it easily.
But I am not sure about the name "ihash".
> 3. What mean the name "CCAN"?
Comprehensive C Archive Network - ccodearchive.net
> 4. Should we use it on compile.c?
Maybe. I do not know compile.c well enough...
If we can reduce allocations and pointer chasing without regressions,
we should use it.
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-46683
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62527] Re: [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
2014-05-11 10:58 ` [ruby-core:62525] " Eric Wong
@ 2014-05-11 11:02 ` Eric Wong
0 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2014-05-11 11:02 UTC (permalink / raw
To: Ruby developers
Eric Wong <normalperson@yhbt.net> wrote:
> Before: st_table_entry->rb_thread_t->st_table_entry->rb_thread_t ...
Sorry, bad picture for Before, this is more accurate:
st_table_entry -> st_table_entry -> st_table_entry
| | |
V V V
rb_thread_t rb_thread_t rb_thread_t
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62528] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (7 preceding siblings ...)
2014-05-11 10:58 ` [ruby-core:62526] " normalperson
@ 2014-05-11 11:09 ` normalperson
2014-05-13 7:08 ` [ruby-core:62557] " akr
` (3 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: normalperson @ 2014-05-11 11:09 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Eric Wong.
Eric Wong <normalperson@yhbt.net> wrote:
> Before: st_table_entry->rb_thread_t->st_table_entry->rb_thread_t ...
Sorry, bad picture for Before, this is more accurate:
st_table_entry -> st_table_entry -> st_table_entry
| | |
V V V
rb_thread_t rb_thread_t rb_thread_t
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-46684
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62557] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (8 preceding siblings ...)
2014-05-11 11:09 ` [ruby-core:62528] " normalperson
@ 2014-05-13 7:08 ` akr
2014-05-13 7:38 ` [ruby-core:62560] " normalperson
` (2 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: akr @ 2014-05-13 7:08 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Akira Tanaka.
2014-05-11 8:50 GMT+09:00 Eric Wong <normalperson@yhbt.net>:
> Eric Wong <normalperson@yhbt.net> wrote:
>> Any comment? My main concern is it's a large import of new code;
>> but it is also highly reusable. I'll commit in 2-4 weeks if no response.
>> The 0002 patch can wait longer.
>
> Committed as r45913. Hopefully nothing breaks, I tested extensively
> on my "production" server. Sorry for the delay, was busy.
I found that doxygen produces many warnings in ccan/ directory.
http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20140510T235500Z.diff.html.gz
It seems the comments in ccan/ directory is not doxygen-compatible.
Anyone use doxygen?
If no one use it, we can drop doxygen support.
(It makes the CI faster.)
--
Tanaka Akira
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-46708
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62560] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (9 preceding siblings ...)
2014-05-13 7:08 ` [ruby-core:62557] " akr
@ 2014-05-13 7:38 ` normalperson
2014-05-13 7:38 ` [ruby-core:62561] " nobu
2014-09-13 23:58 ` [ruby-core:65023] " normalperson
12 siblings, 0 replies; 20+ messages in thread
From: normalperson @ 2014-05-13 7:38 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Eric Wong.
Tanaka Akira <akr@fsij.org> wrote:
> I found that doxygen produces many warnings in ccan/ directory.
> http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20140510T235500Z.diff.html.gz
>
> It seems the comments in ccan/ directory is not doxygen-compatible.
Sorry about that.
> Anyone use doxygen?
> If no one use it, we can drop doxygen support.
> (It makes the CI faster.)
I do not use it.
We may also fix the comments to be doxygen-compatible and send patches
upstream to ccan. But if nobody uses doxygen, we save time by dropping
it.
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-46709
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:62561] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (10 preceding siblings ...)
2014-05-13 7:38 ` [ruby-core:62560] " normalperson
@ 2014-05-13 7:38 ` nobu
2014-09-13 23:58 ` [ruby-core:65023] " normalperson
12 siblings, 0 replies; 20+ messages in thread
From: nobu @ 2014-05-13 7:38 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Nobuyoshi Nakada.
(2014/05/13 16:29), Eric Wong wrote:
> Tanaka Akira <akr@fsij.org> wrote:
>> Anyone use doxygen?
>> If no one use it, we can drop doxygen support.
>> (It makes the CI faster.)
>
> I do not use it.
I don't use it too (it's too time consuming)
> We may also fix the comments to be doxygen-compatible and send patches
> upstream to ccan. But if nobody uses doxygen, we save time by dropping
> it.
Or adding ccan to EXCLUDE in template/Doxyfile.tmpl.
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-46710
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:65022] Re: [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
2014-05-11 10:08 ` [ruby-core:62524] " ko1
@ 2014-09-13 23:55 ` Eric Wong
0 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2014-09-13 23:55 UTC (permalink / raw
To: Ruby developers
ko1@atdot.net wrote:
> 4. Should we use it on compile.c?
Yes, and probably gc.c, too. I think it would help improve readability
and remove some branches in our current code.
I have submitted patches for list_add_after, list_add_before and
list_swap functions:
https://lists.ozlabs.org/pipermail/ccan/2014-September/thread.html
I think this will be next year for Ruby 2.3.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [ruby-core:65023] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
` (11 preceding siblings ...)
2014-05-13 7:38 ` [ruby-core:62561] " nobu
@ 2014-09-13 23:58 ` normalperson
12 siblings, 0 replies; 20+ messages in thread
From: normalperson @ 2014-09-13 23:58 UTC (permalink / raw
To: ruby-core
Issue #9632 has been updated by Eric Wong.
ko1@atdot.net wrote:
> 4. Should we use it on compile.c?
Yes, and probably gc.c, too. I think it would help improve readability
and remove some branches in our current code.
I have submitted patches for list_add_after, list_add_before and
list_swap functions:
https://lists.ozlabs.org/pipermail/ccan/2014-September/thread.html
I think this will be next year for Ruby 2.3.
----------------------------------------
Feature #9632: [PATCH 0/2] speedup IO#close with linked-list from ccan
https://bugs.ruby-lang.org/issues/9632#change-48893
* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: core
* Target version: current: 2.2.0
----------------------------------------
This imports the ccan linked-list (BSD-MIT licensed version of the Linux kernel
linked list). I cut out some of the unused str* code (only for debugging),
but it's still a big import of new code. Modifications to existing code is
minimal, and it makes the living_threads iteration functions simpler.
The improvement is great, and there may be future places where we could
use a doubly linked list.
= vm->living_threads:
* before: st hash table had extra malloc overhead, and slow iteration due
to bad cache locality
* after: guaranteed O(1) insert/remove performance (branchless!)
iteration is still O(n), but performance is improved in IO#close
due to less pointer chasing
= IO#close: further improvement with second linked list
* before: IO#close is linear based on number of living threads
* after: IO#close is linear based on number of waiting threads
No extra malloc is needed (only 2 new pointers in existing structs)
for a secondary linked-list for waiting FDs.
I chose the ccan linked list over BSD <sys/queue.h> for two reasons:
1) insertion and removal are both branchless
2) locality is improved if a struct may be a member of multiple lists
git://80x24.org/ruby.git threads-list
---Files--------------------------------
0002-speedup-IO-close-with-many-living-threads.patch (2.86 KB)
0001-doubly-linked-list-from-ccan-to-manage-vm-living_thr.patch (68.1 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2014-09-14 0:19 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <redmine.issue-9632.20140313032652@ruby-lang.org>
2014-03-13 3:26 ` [ruby-core:61452] [ruby-trunk - Feature #9632] [Open] [PATCH 0/2] speedup IO#close with linked-list from ccan normalperson
2014-03-19 8:26 ` [ruby-core:61593] " Eric Wong
2014-03-30 3:28 ` [ruby-core:61759] " Eric Wong
2014-03-19 8:28 ` [ruby-core:61595] [ruby-trunk - Feature #9632] " normalperson
2014-03-30 3:28 ` [ruby-core:61760] " normalperson
2014-04-05 23:37 ` [ruby-core:61870] " Eric Wong
2014-05-10 23:50 ` [ruby-core:62519] " Eric Wong
2014-04-05 23:38 ` [ruby-core:61871] " normalperson
2014-05-10 23:58 ` [ruby-core:62520] " normalperson
2014-05-11 10:07 ` [ruby-core:62523] " ko1
2014-05-11 10:58 ` [ruby-core:62525] " Eric Wong
2014-05-11 11:02 ` [ruby-core:62527] " Eric Wong
2014-05-11 10:08 ` [ruby-core:62524] " ko1
2014-09-13 23:55 ` [ruby-core:65022] " Eric Wong
2014-05-11 10:58 ` [ruby-core:62526] " normalperson
2014-05-11 11:09 ` [ruby-core:62528] " normalperson
2014-05-13 7:08 ` [ruby-core:62557] " akr
2014-05-13 7:38 ` [ruby-core:62560] " normalperson
2014-05-13 7:38 ` [ruby-core:62561] " nobu
2014-09-13 23:58 ` [ruby-core:65023] " normalperson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).