dee

Merge lp:~kamstrup/dee/less-gtype-dancing into lp:dee

Proposed by Mikkel Kamstrup Erlandsen
Status: Merged
Approved by: Michal Hruby
Approved revision: 353
Merged at revision: 348
Proposed branch: lp:~kamstrup/dee/less-gtype-dancing
Merge into: lp:dee
Diff against target: 302 lines (+83/-34)
7 files modified
src/dee-model.c (+6/-13)
src/dee-model.h (+4/-1)
src/dee-sequence-model.c (+37/-15)
src/dee-serializable-model.c (+28/-3)
vapi/Dee-1.0-custom.vala (+6/-0)
vapi/Dee-1.0.metadata (+1/-1)
vapi/dee-1.0.vapi (+1/-1)
To merge this branch: bzr merge lp:~kamstrup/dee/less-gtype-dancing
Reviewer Review Type Date Requested Status
Michal Hruby (community) Approve
Mikkel Kamstrup Erlandsen Pending
Review via email: mp+93980@code.launchpad.net

This proposal supersedes a proposal from 2012-02-21.

Description of the change

A series of optimizations for DeeSequenceModel. Notably benchmarks report improvements:

append+prepend: ~10%
sorted: ~5%
read_string: ~25%
read_row: ~50%
clear: ~10%
walk_next: ~50%
walk_pos: ~15%
FilterModel.collate,collate_desc,sort_uint: ~5-10%

Probably many small gains here and there.

To post a comment you must log in.
Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote : Posted in a previous version of this proposal

I am not entirely sure what the impact of this is...

269 - [CCode (array_length = false, array_null_terminated = true)]
270 - public GLib.Variant[] get_row (Dee.ModelIter iter, [CCode (array_length = false)] out GLib.Variant[] out_row_members = null);
271 + [NoWrapper]
272 + public abstract GLib.Variant get_row (Dee.ModelIter iter, GLib.Variant out_row_members = null);

Revision history for this message
Michal Hruby (mhr3) wrote : Posted in a previous version of this proposal

Faster everything, yey!

This seems to have broken gir a little and vapigen now can't match the virtual get_row to the invoker method, could you move the whole get_row method to -custom.vala (with all the annotations there were + make it abstract).

review: Needs Fixing
Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote : Posted in a previous version of this proposal

> Faster everything, yey!
>
> This seems to have broken gir a little and vapigen now can't match the virtual
> get_row to the invoker method, could you move the whole get_row method to
> -custom.vala (with all the annotations there were + make it abstract).

Pushed as r352

Revision history for this message
Michal Hruby (mhr3) wrote :

Awesome! :)

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/dee-model.c'
--- src/dee-model.c 2012-01-26 18:30:57 +0000
+++ src/dee-model.c 2012-02-21 12:37:14 +0000
@@ -1436,26 +1436,19 @@
1436 * or a newly allocated array otherwise which you must free1436 * or a newly allocated array otherwise which you must free
1437 * with g_free(). The variants in the array will have a strong1437 * with g_free(). The variants in the array will have a strong
1438 * reference and needs to be freed with g_variant_unref().1438 * reference and needs to be freed with g_variant_unref().
1439 **/1439 */
1440GVariant**1440GVariant**
1441dee_model_get_row (DeeModel *self,1441dee_model_get_row (DeeModel *self,
1442 DeeModelIter *iter,1442 DeeModelIter *iter,
1443 GVariant **out_row_members)1443 GVariant **out_row_members)
1444{1444{
1445 guint col, n_cols;1445 DeeModelIface *iface;
14461446
1447 g_return_val_if_fail (DEE_IS_MODEL (self), NULL);1447 g_return_val_if_fail (DEE_IS_MODEL (self), NULL);
1448 g_return_val_if_fail (iter != NULL, NULL);1448
14491449 iface = DEE_MODEL_GET_IFACE (self);
1450 n_cols = dee_model_get_n_columns (self);1450
14511451 return (* iface->get_row) (self, iter, out_row_members);
1452 if (out_row_members == NULL)
1453 out_row_members = g_new0 (GVariant*, n_cols + 1);
1454
1455 for (col = 0; col < n_cols; col++)
1456 out_row_members[col] = dee_model_get_value (self, iter, col);
1457
1458 return out_row_members;
1459}1452}
14601453
1461/**1454/**
14621455
=== modified file 'src/dee-model.h'
--- src/dee-model.h 2012-01-26 18:30:57 +0000
+++ src/dee-model.h 2012-02-21 12:37:14 +0000
@@ -215,6 +215,10 @@
215 DeeModelIter *iter,215 DeeModelIter *iter,
216 DeeModelTag *tag,216 DeeModelTag *tag,
217 gpointer value);217 gpointer value);
218
219 GVariant** (*get_row) (DeeModel *self,
220 DeeModelIter *iter,
221 GVariant **out_row_members);
218222
219 /*< private >*/223 /*< private >*/
220 void (*_dee_model_1) (void);224 void (*_dee_model_1) (void);
@@ -224,7 +228,6 @@
224 void (*_dee_model_5) (void);228 void (*_dee_model_5) (void);
225 void (*_dee_model_6) (void);229 void (*_dee_model_6) (void);
226 void (*_dee_model_7) (void);230 void (*_dee_model_7) (void);
227 void (*_dee_model_8) (void);
228};231};
229232
230GType dee_model_iter_get_type (void);233GType dee_model_iter_get_type (void);
231234
=== modified file 'src/dee-sequence-model.c'
--- src/dee-sequence-model.c 2012-01-10 07:43:54 +0000
+++ src/dee-sequence-model.c 2012-02-21 12:37:14 +0000
@@ -128,6 +128,10 @@
128 DeeModelIter *iter,128 DeeModelIter *iter,
129 guint column);129 guint column);
130130
131static GVariant** dee_sequence_model_get_row (DeeModel *self,
132 DeeModelIter *iter,
133 GVariant **out_row_members);
134
131static DeeModelIter* dee_sequence_model_get_first_iter (DeeModel *self);135static DeeModelIter* dee_sequence_model_get_first_iter (DeeModel *self);
132136
133static DeeModelIter* dee_sequence_model_get_last_iter (DeeModel *self);137static DeeModelIter* dee_sequence_model_get_last_iter (DeeModel *self);
@@ -295,6 +299,7 @@
295 iface->set_row = dee_sequence_model_set_row;299 iface->set_row = dee_sequence_model_set_row;
296 iface->set_value = dee_sequence_model_set_value;300 iface->set_value = dee_sequence_model_set_value;
297 iface->get_value = dee_sequence_model_get_value;301 iface->get_value = dee_sequence_model_get_value;
302 iface->get_row = dee_sequence_model_get_row;
298 iface->get_first_iter = dee_sequence_model_get_first_iter;303 iface->get_first_iter = dee_sequence_model_get_first_iter;
299 iface->get_last_iter = dee_sequence_model_get_last_iter;304 iface->get_last_iter = dee_sequence_model_get_last_iter;
300 iface->get_iter_at_row = dee_sequence_model_get_iter_at_row;305 iface->get_iter_at_row = dee_sequence_model_get_iter_at_row;
@@ -469,9 +474,7 @@
469474
470 g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self));475 g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self));
471 g_return_if_fail (iter != NULL);476 g_return_if_fail (iter != NULL);
472477 g_return_if_fail (!g_sequence_iter_is_end (iter));
473 if (iter_ == dee_model_get_last_iter (self))
474 return;
475478
476 if (iter)479 if (iter)
477 {480 {
@@ -500,6 +503,7 @@
500 g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self));503 g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self));
501 g_return_if_fail (iter != NULL);504 g_return_if_fail (iter != NULL);
502 g_return_if_fail (value != NULL);505 g_return_if_fail (value != NULL);
506 g_return_if_fail (column < dee_model_get_n_columns (self));
503 507
504 priv = _self->priv;508 priv = _self->priv;
505 509
@@ -546,14 +550,9 @@
546 guint column,550 guint column,
547 GVariant *value)551 GVariant *value)
548{552{
549 DeeSequenceModel *_self = (DeeSequenceModel *)self;
550 gpointer *row;553 gpointer *row;
551554
552 g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self));
553 g_return_if_fail (iter != NULL);
554 g_return_if_fail (column < dee_model_get_n_columns (self));
555 g_return_if_fail (g_variant_type_equal (g_variant_get_type (value), G_VARIANT_TYPE (dee_model_get_column_schema (self, column))));555 g_return_if_fail (g_variant_type_equal (g_variant_get_type (value), G_VARIANT_TYPE (dee_model_get_column_schema (self, column))));
556 g_return_if_fail (value != NULL);
557556
558 row = g_sequence_get ((GSequenceIter *) iter);557 row = g_sequence_get ((GSequenceIter *) iter);
559558
@@ -576,13 +575,8 @@
576 DeeModelIter *iter,575 DeeModelIter *iter,
577 guint column)576 guint column)
578{577{
579 DeeSequenceModel *_self = (DeeSequenceModel *)self;
580 gpointer *row;578 gpointer *row;
581579
582 g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (_self), NULL);
583 g_return_val_if_fail (iter != NULL, NULL);
584 g_return_val_if_fail (column < dee_model_get_n_columns (self), NULL);
585
586 row = g_sequence_get ((GSequenceIter *) iter);580 row = g_sequence_get ((GSequenceIter *) iter);
587 if (G_UNLIKELY (row == NULL))581 if (G_UNLIKELY (row == NULL))
588 {582 {
@@ -600,6 +594,10 @@
600 DeeModelIter *iter,594 DeeModelIter *iter,
601 guint column)595 guint column)
602{596{
597 g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL);
598 g_return_val_if_fail (iter != NULL, NULL);
599 g_return_val_if_fail (column < dee_model_get_n_columns (self), NULL);
600
603 GVariant *val = dee_sequence_model_peek_value (self, iter, column);601 GVariant *val = dee_sequence_model_peek_value (self, iter, column);
604602
605 if (G_UNLIKELY (val == NULL))603 if (G_UNLIKELY (val == NULL))
@@ -613,6 +611,30 @@
613 return g_variant_ref (val);611 return g_variant_ref (val);
614}612}
615613
614static GVariant**
615dee_sequence_model_get_row (DeeModel *self,
616 DeeModelIter *iter,
617 GVariant **out_row_members)
618{
619 guint col, n_cols;
620
621 g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL);
622
623 n_cols = dee_model_get_n_columns (self);
624
625 if (out_row_members == NULL)
626 out_row_members = g_new0 (GVariant*, n_cols + 1);
627
628 /* We use peek_value() here because it saves us from some expensive checks
629 * compared to get_value(), that we can guarantee from this call site anyway
630 */
631 for (col = 0; col < n_cols; col++)
632 out_row_members[col] = g_variant_ref (
633 dee_sequence_model_peek_value (self, iter, col));
634
635 return out_row_members;
636}
637
616static DeeModelIter*638static DeeModelIter*
617dee_sequence_model_get_first_iter (DeeModel *self)639dee_sequence_model_get_first_iter (DeeModel *self)
618{640{
@@ -794,7 +816,7 @@
794{816{
795 g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL);817 g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL);
796 g_return_val_if_fail (iter, NULL);818 g_return_val_if_fail (iter, NULL);
797 g_return_val_if_fail (!dee_model_is_last (self, iter), NULL);819 g_return_val_if_fail (!g_sequence_iter_is_end ((GSequenceIter*) iter), NULL);
798820
799 return (DeeModelIter *) g_sequence_iter_next ((GSequenceIter *)iter);821 return (DeeModelIter *) g_sequence_iter_next ((GSequenceIter *)iter);
800}822}
@@ -805,7 +827,7 @@
805{827{
806 g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL);828 g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL);
807 g_return_val_if_fail (iter, NULL);829 g_return_val_if_fail (iter, NULL);
808 g_return_val_if_fail (!dee_model_is_first (self, iter), NULL);830 g_return_val_if_fail (!g_sequence_iter_is_begin ((GSequenceIter*) iter), NULL);
809831
810 return (DeeModelIter *) g_sequence_iter_prev ((GSequenceIter *)iter);832 return (DeeModelIter *) g_sequence_iter_prev ((GSequenceIter *)iter);
811}833}
812834
=== modified file 'src/dee-serializable-model.c'
--- src/dee-serializable-model.c 2012-01-09 11:17:10 +0000
+++ src/dee-serializable-model.c 2012-02-21 12:37:14 +0000
@@ -144,6 +144,10 @@
144 DeeModelIter *iter,144 DeeModelIter *iter,
145 guint column);145 guint column);
146146
147static GVariant** dee_serializable_model_get_row (DeeModel *self,
148 DeeModelIter *iter,
149 GVariant **out_row_members);
150
147static DeeModelIter* dee_serializable_model_get_first_iter (DeeModel *self);151static DeeModelIter* dee_serializable_model_get_first_iter (DeeModel *self);
148152
149static DeeModelIter* dee_serializable_model_get_last_iter (DeeModel *self);153static DeeModelIter* dee_serializable_model_get_last_iter (DeeModel *self);
@@ -456,16 +460,16 @@
456static void460static void
457dee_serializable_model_clear (DeeModel *self)461dee_serializable_model_clear (DeeModel *self)
458{462{
459 DeeModelIter *iter;463 DeeModelIter *iter, *end;
460464
461 g_return_if_fail (DEE_IS_SERIALIZABLE_MODEL (self));465 g_return_if_fail (DEE_IS_SERIALIZABLE_MODEL (self));
462466
463 iter = dee_model_get_first_iter (self);467 iter = dee_model_get_first_iter (self);
468 end = dee_model_get_last_iter (self);
464469
465 while (!dee_model_is_last (self, iter))470 while (iter != end)
466 {471 {
467 dee_model_remove (self, iter);472 dee_model_remove (self, iter);
468
469 iter = dee_model_get_first_iter (self); 473 iter = dee_model_get_first_iter (self);
470 }474 }
471}475}
@@ -614,6 +618,26 @@
614 return NULL;618 return NULL;
615}619}
616620
621static GVariant**
622dee_serializable_model_get_row (DeeModel *self,
623 DeeModelIter *iter,
624 GVariant **out_row_members)
625{
626 guint col, n_cols;
627
628 g_return_val_if_fail (DEE_IS_SERIALIZABLE_MODEL (self), NULL);
629
630 n_cols = dee_model_get_n_columns (self);
631
632 if (out_row_members == NULL)
633 out_row_members = g_new0 (GVariant*, n_cols + 1);
634
635 for (col = 0; col < n_cols; col++)
636 out_row_members[col] = dee_model_get_value (self, iter, col);
637
638 return out_row_members;
639}
640
617static gboolean641static gboolean
618dee_serializable_model_get_bool (DeeModel *self,642dee_serializable_model_get_bool (DeeModel *self,
619 DeeModelIter *iter,643 DeeModelIter *iter,
@@ -1111,6 +1135,7 @@
1111 iface->set_value = dee_serializable_model_set_value;1135 iface->set_value = dee_serializable_model_set_value;
1112 iface->set_row = dee_serializable_model_set_row;1136 iface->set_row = dee_serializable_model_set_row;
1113 iface->get_value = dee_serializable_model_get_value;1137 iface->get_value = dee_serializable_model_get_value;
1138 iface->get_row = dee_serializable_model_get_row;
1114 iface->get_first_iter = dee_serializable_model_get_first_iter;1139 iface->get_first_iter = dee_serializable_model_get_first_iter;
1115 iface->get_last_iter = dee_serializable_model_get_last_iter;1140 iface->get_last_iter = dee_serializable_model_get_last_iter;
1116 iface->get_iter_at_row = dee_serializable_model_get_iter_at_row;1141 iface->get_iter_at_row = dee_serializable_model_get_iter_at_row;
11171142
=== modified file 'vapi/Dee-1.0-custom.vala'
--- vapi/Dee-1.0-custom.vala 2012-02-19 17:19:33 +0000
+++ vapi/Dee-1.0-custom.vala 2012-02-21 12:37:14 +0000
@@ -1,5 +1,11 @@
1namespace Dee {1namespace Dee {
22
3 [CCode (type_id = "dee_model_get_type ()")]
4 public interface Model {
5 [CCode (array_length = false, array_null_terminated = true)]
6 public abstract GLib.Variant[] get_row (Dee.ModelIter iter, [CCode (array_length = false)] out GLib.Variant[] out_row_members = null);
7 }
8
3 public struct Filter {9 public struct Filter {
4 [CCode (cname = "destroy")]10 [CCode (cname = "destroy")]
5 public GLib.DestroyNotify destroy_notify;11 public GLib.DestroyNotify destroy_notify;
612
=== modified file 'vapi/Dee-1.0.metadata'
--- vapi/Dee-1.0.metadata 2012-01-26 10:51:42 +0000
+++ vapi/Dee-1.0.metadata 2012-02-21 12:37:14 +0000
@@ -6,7 +6,7 @@
6Model6Model
7 .append skip=false7 .append skip=false
8 .get skip=false8 .get skip=false
9 .get_row.out_row_members default=null9 .get_row skip
10 .insert skip=false10 .insert skip=false
11 .insert_before skip=false11 .insert_before skip=false
12 .insert_sorted skip=false12 .insert_sorted skip=false
1313
=== modified file 'vapi/dee-1.0.vapi'
--- vapi/dee-1.0.vapi 2012-02-19 17:19:33 +0000
+++ vapi/dee-1.0.vapi 2012-02-21 12:37:14 +0000
@@ -217,7 +217,7 @@
217 public abstract uint get_n_rows ();217 public abstract uint get_n_rows ();
218 public abstract uint get_position (Dee.ModelIter iter);218 public abstract uint get_position (Dee.ModelIter iter);
219 [CCode (array_length = false, array_null_terminated = true)]219 [CCode (array_length = false, array_null_terminated = true)]
220 public GLib.Variant[] get_row (Dee.ModelIter iter, [CCode (array_length = false)] out GLib.Variant[] out_row_members = null);220 public abstract GLib.Variant[] get_row (Dee.ModelIter iter, [CCode (array_length = false)] out GLib.Variant[] out_row_members = null);
221 [CCode (array_length_pos = 0.1, array_length_type = "guint")]221 [CCode (array_length_pos = 0.1, array_length_type = "guint")]
222 public abstract unowned string[] get_schema ();222 public abstract unowned string[] get_schema ();
223 public abstract unowned string get_string (Dee.ModelIter iter, uint column);223 public abstract unowned string get_string (Dee.ModelIter iter, uint column);

Subscribers

People subscribed via source and target branches